今回は、GUIのスライダーやボタンでオブジェクトの位置や回転を制御する方法を試してみました。
シーンの作成
オブジェクトの配置
シーンにフリーアセットのキャラクター、Space Robot Kyle を画面中央に配置。画面左右と下側にスライダーを配置しました。リセットボタンを画面上部に配置しました。

オブジェクトの階層設定
オブジェクトの回転制御をするために、Empty オブジェクトで親子階層を作成。X、Y、Z軸回転を別々に制御する構造にしました。

スクリプトの作成
GUIスライダーでオブジェクトを制御するためのスクリプトを作成します。
回転制御のオブジェクト、スライダーオブジェクト、リセットボタンを格納する変数をすべて public 変数にして[Inspector]ウィンドウから割り当てる方法にしました。
コードは次の通りです。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// GUIコンポーネントの関数を使用する宣言
using UnityEngine.UI;
public class SliderControl : MonoBehaviour
{
// 位置を制御するオブジェクト(Transform)を格納する変数
public Transform obj;
// X軸回転を制御するオブジェクト(Transform)を格納する変数
public Transform objRotX;
// Y軸回転を制御するオブジェクト(Transform)を格納する変数
public Transform objRotY;
// Z軸回転を制御するオブジェクト(Transform)を格納する変数
public Transform objRotZ;
// X軸座標を制御する Slider オブジェクトを格納する変数
public Slider sliderPosX;
// Y軸座標を制御する Slider オブジェクトを格納する変数
public Slider sliderPosY;
// Z軸座標を制御する Slider オブジェクトを格納する変数
public Slider sliderPosZ;
// X軸回転を制御する Slider オブジェクトを格納する変数
public Slider sliderRotX;
// Y軸回転を制御する Slider オブジェクトを格納する変数
public Slider sliderRotY;
// Z軸回転を制御する Slider オブジェクトを格納する変数
public Slider sliderRotZ;
// X軸座標を制御する処理
public void ValuePosX()
{
// オブジェクトの座標を変数 objPos に格納
Vector3 objPos = obj.position;
// スライダーの値を変数 objPos に格納
objPos.x = sliderPosX.value;
// 変数 objPos の値をオブジェクトの座標に格納
obj.position = objPos;
}
// Y軸座標を制御する処理
public void ValuePosY()
{
// オブジェクトの座標を変数 objPos に格納
Vector3 objPos = obj.position;
// スライダーの値を変数 objPos に格納
objPos.y = sliderPosY.value;
// 変数 objPos の値をオブジェクトの座標に格納
obj.position = objPos;
}
// Z軸座標を制御する処理
public void ValuePosZ()
{
// オブジェクトの座標を変数 objPos に格納
Vector3 objPos = obj.position;
// スライダーの値を変数 objPos に格納
objPos.z = sliderPosZ.value;
// 変数 objPos の値をオブジェクトの座標に格納
obj.position = objPos;
}
// X軸回転を制御する処理
public void ValueRotX()
{
// スライダーの値をオブジェクトのX軸回転値に格納
objRotX.eulerAngles = new Vector3(sliderRotX.value, 0, 0);
}
// Y軸回転を制御する処理
public void ValueRotY()
{
// スライダーの値をオブジェクトのY軸回転値に格納
//(親オブジェクトから見た相対的なオイラー角の回転値)
objRotY.localEulerAngles = new Vector3(0, sliderRotY.value, 0);
}
// Z軸回転を制御する処理
public void ValueRotZ()
{
// スライダーの値をオブジェクトのZ軸回転値に格納
//(親オブジェクトから見た相対的なオイラー角の回転値)
objRotZ.localEulerAngles = new Vector3(0, 0, sliderRotZ.value);
}
// リセット処理(座標値)
public void ValueResetPos()
{
// スライダーの値に 0 を格納
sliderPosX.value = 0f;
sliderPosY.value = 0f;
sliderPosZ.value = 0f;
}
// リセット処理(回転値)
public void ValueResetRot()
{
// スライダーの値に 0 を格納
sliderRotX.value = 0f;
sliderRotY.value = 0f;
sliderRotZ.value = 0f;
}
}
Y軸とZ軸の回転制御オブジェクトは子オブジェクトなので、回転値の受渡しに localEulerAngles を使用しました。下記のとおり、公式スクリプトリファレンスを参考にしました。
Transform.localEulerAngles – Unity スクリプトリファレンス
親の Transform オブジェクトから見た相対的なオイラー角としての回転値
x、y、z の値により、Z軸で z 度、X軸で x 度、Y軸で y 度 回転します。またこの順番で回転します。
Unity は自動的に Transform.localRotation に格納されている回転から角度を変換します。
座標値の制御についてはこちらの記事で紹介した、Vector3 のローカル変数を使用して特定の座標値だけ更新する書き方を使いました。
スクリプトの設定
作成したスクリプト SliderControl はCanvasにアタッチ。
[Inspector]ウィンドウで表示されている変数フィールドにそれぞれGUIスライダー、リセットボタンをドラッグ&ドロップで割り当てました。

WebGLでビルドしたシーン
今回作成したシーンをWebGLでビルドしました。