SFMLでゲームを作りたかったんですが
ゲーム開発の初心者には簡単ではなかったので
Unity(ユニティ)にしばらく目を向きました。
何回も探している内容は整理して置くことにしました。
基本設定
=======
GameObject >>3D Object >>Plane
GameObject >>3D Object >>Cube
Cubeが基本的にPlaneに半分埋められているので
Scale(Y:高さ)1の半分の値をPosition(Y:位置上下)0.5に設定してPlaneの上にちょうど置かれようにしました。
カメラで見える画面を調整します。
Main Cameraを選択した状態で GameObject >>Align With Viewを選択すると現在Sceneに表示されているのがカメラの視点に設定されます。
Assets>>Create>>Meterial
作られたMeterialを選択、Inspector:Main Maps:Albedoで色を変更後CubeへドラックアンドドロップしてCubeの色を変更しました。
Assets>>Create>>C# Script
スクリプトを1つ作成、Cubeへドラックアンドドロップして連結しました。
=======
移動処理
=======
1.Transform.Translate利用
GameObjectのTransform(Position,Rotate,Scale)のPositionを直接Translateメソッドを利用して移動させる方法です。
Transform.Translate
--------------
void Update ()
{
if (Input.GetKey(KeyCode.W))
{
transform.Translate(Vector3.forward * Time.deltaTime);
}
if (Input.GetKey(KeyCode.S))
{
transform.Translate(Vector3.back * Time.deltaTime);
}
if (Input.GetKey(KeyCode.A))
{
transform.Translate(Vector3.left * Time.deltaTime);
}
if (Input.GetKey(KeyCode.D))
{
transform.Translate(Vector3.right * Time.deltaTime);
}
}
print(Vector3.forward)でUnityのConsoleから確認した値です。
Vector3.forward →(0.0, 0.0, 1.0) z値の 1 増加
Vector3.back →(0.0, 0.0, -1.0) z値の 1 減少
Vector3.right →(1.0, 0.0, 0.0) x値の 1 増加
Vector3.left →(-1.0, 0.0, 0.0) x値の 1 減少
早く移動させたい場合はspeedような変数を作って乗じると良いと思います。
Time.deltaTimeは最後プレームの処理にかかった時間でプレーム速度を独立的にしたい場合利用と説明されていました。
Time.deltaTime
端末の仕様によって(プレーム別処理速度が違う場合)固定でプレーム当処理をすると差が出る可能性あるので時間当(仕様に合わせて調整)する値と理解しました。
--------------
2.RigidBody.Velocity利用
GameObjectへ物理的な速度(RigidBody.Verocity)を加えて移動させる方法です。
Rigidbody.velocity
先ずCubeを選択した状態で
Component>>Physics>>Rigidbodyを追加します。
--------------
private Rigidbody rb;
void Start ()
{
rb = GetComponent<Rigidbody>();
}
void Update ()
{
if (Input.GetKey(KeyCode.W))
{
//rb.velocity = new Vector3(0, 0, 1);
rb.velocity = Vector3.forward;
}
if (Input.GetKey(KeyCode.S))
{
rb.velocity = new Vector3(0, 0, -1);
}
if (Input.GetKey(KeyCode.A))
{
rb.velocity = new Vector3(-1, 0, 0);
}
if (Input.GetKey(KeyCode.D))
{
rb.velocity = new Vector3(1, 0, 0);
}
}
rbを別に宣言しなくGetComponent<Rigidbody>().verocityでも利用可能です。
new Vector3(0,0,1)のように直接Vector値を入れでもVector3.forwardにしても可能です。
(追加)
rigidbodyを利用した処理は物理シミュレーションで、この場合はUpdate()よりはFixedUpdate()を利用するのが良いことでした。
Update()はプレーム単位で呼ばれて、 FixedUpdate()は物理処理単位で呼ばれます。
Update と FixedUpdate
作動されるとCubeが転がりながら移動します。
Cubeに追加したRigidbodyのConstrains:Freeze RotationのX,Zへチェックすると転がらなくなります。
--------------
3.RigidBody.AddForce利用
GameObjectへ物理的な力(RigidBody.AddForce)を入れて移動させる方法です。
Rigidbody.AddForce
--------------
private Rigidbody rb;
void Start ()
{
rb = GetComponent<Rigidbody>();
}
void Update ()
{
if (Input.GetKey(KeyCode.W))
{
//rb.AddForce(new Vector3(0, 0, 10));
rb.AddForce(Vector3.forward*10);
}
if (Input.GetKey(KeyCode.S))
{
rb.AddForce(new Vector3(0, 0, -10));
}
if (Input.GetKey(KeyCode.A))
{
rb.AddForce(new Vector3(-10, 0, 0));
}
if (Input.GetKey(KeyCode.D))
{
rb.AddForce(new Vector3(10, 0, 0));
}
}
new Vector3(0,0,10)、Vector3.forwardどちらも利用可能でした。
力の値もVector3で表現されるようです。10ぐらいの値が必要でした。
--------------
=======
Unity(유니티) 정리: 01.이동

댓글 없음:
댓글 쓰기