もねスタ

Unity、Blender、Aflame中心にVR/ARなど好き勝手書いていく雑記ブログ

【Unity C#】基本!シンプルな移動・回転スクリプトを解剖する

f:id:saharu54:20180917174029g:plain
こんにちは。
最近はaframeばかり触っていましたがUnityにちょこっと帰って来ました。

今回も非エンジニアの著者が勉強と自分用のメモを書いていきたいと思います。
(コーディング勉強中の身なので参考程度にご覧ください)

今回の勉強するポイントは
C#でシンプルな移動・回転を実現するにはどのようにすればいいか。
アニメーションの呼び出しなどはしません。

前置き

今回は私が一番よく利用するCharacterControllerを利用した移動方法です。

コードなどに関してこちらの記事を参考にさせていただきました。 tama-lab.net

さっそくコード

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class controller : MonoBehaviour {

  // まずspeed、gravityの数値を代入
    public float speed = 3.0f;
    public float gravity = 20.0f;
     
    private Vector3 moveDirection = Vector3.zero;
    
    void Update () {
        
        // CharacterController取得
        CharacterController controller = GetComponent<CharacterController>();

        // 回転
        transform.Rotate(0, Input.GetAxis("Horizontal") * speed, 0);


        if (controller.isGrounded) {
            moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
            moveDirection = transform.TransformDirection(moveDirection);
            moveDirection *= speed;
            
        }
        moveDirection.y -= gravity * Time.deltaTime;
        controller.Move(moveDirection * Time.deltaTime);
    }
}

コーディング勉強中の身としては、
何がなんの挙動をしているのかが一番知りたいポイントなので自分なりに分解していきます。

移動スクリプトで最低限必要なものは何か

① まず移動ということで移動スピードと重力の指定は必須
なので最初にspeedとgravityに数値を代入しています。

今回回転も実装したスクリプトですが旋回スピードを変更したい場合は ここで一緒に旋回スピードを代入するといいかもですね。
Unity-chanのアセットに入っているUnitychanController.csなんかはrotateSpeedに数値入れていじれるようになっています。

特にVRFPSゲームの場合、旋回スピードが早すぎると異常に酔うので指定は必須かもしれません。

② 次にprivate Vector3 moveDirection = Vector3.zero;
正直最近コード書き始めた自分にとっては「なんのこっちゃ」って感じですが

そもそもVector3とは…

3D ベクトルと位置の表現 この構造体は Unity 全体の 3D での位置や方向のために使用されています。 一般的なベクトル演算を行うための関数が含まれています。 引用:Unity - スクリプトリファレンス: Vector3

スクリプト書いているとVector3(0, 0, 0)などの表記をよく見かけますが
これは3Dベクトル(三次元)上でx,y,z軸のどこ座標にオブジェクトがいるか、位置を示すものとしてUnityでは頻出ですね。

さて、そんな中でもVector3.zeroはVector3(0, 0, 0)と同じ意味です。

ということでprivate Vector3 moveDirection = Vector3.zero;は ゼロの座標をスクリプト内で簡単にいじれるように最初で代入しているのかな・・?(あんまりわかってない)

③ 次はvoid Updateのカッコ内を見ていきましょうかね。
回転はtransform.Rotate(0, Input.GetAxis("Horizontal") * speed, 0);で実装しています。

transformはこのお馴染みの欄にあるPosition, Rotate, Scaleをスクリプト上で変化させるときに使います。

f:id:saharu54:20180917170204p:plain

Input.GetAxis("Horizontal")についてはこちらの記事が勉強になりました

qiita.com