2018년 3월 9일 금요일

Unity(ユニティ)整理:01.移動

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.이동

댓글 없음:

댓글 쓰기

1、2、QWER! in OSAKA (大阪 2025/4/10(木) Yogibo META VALLEY)

https://www.creativeman.co.jp/event/qwer-osaka/ QWER - CREATIVEMAN PRODUCTIONS 主催:LIVET 企画:ソニー・ミュージックソリューションズ 招聘:クリエイティブマンプロダクション 制作協力:クリエイテ...