Unityチュートリアル はじめてのゲーム開発 JohnLemon②

Image Unity

Part2

スクリプトとは?

C#で書かれており、キャラクターを動かしたりcomponentを操作するものです。

スクリプトを作成

Assets→Scripts

Scriptsフォルダ内で右クリックCreate→C#Script

Script名をPlayerMovementに変更

PlayerMovementをダブルクリックすると下記のプログラムが表示されます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PlayerMovement : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{}

// Update is called once per frame
void Update()
{

}
}

コードの説明

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

using UnityEngineとは、UnityEngineを使用しますという宣言です。

public class PlayerMovement : MonoBehaviour


ここで言うPlayerMovementとは、ファイル名のことです。

void Start()
{
}

このメソッドに書かれたことは、一番初めに実行されます。

水平軸と垂直軸の変数を作成

void Update()
{
float horizontal = Input.GetAxis ("Horizontal");
//新しいフロート変数を作成し、それを水平に呼び出す。このメソッド呼び出しの結果に等しい変数を設定します。
float vertical = Input.GetAxis ("Vertical");
//新しいフロート変数を作成し、それを垂直に呼び出す。このメソッド呼び出しの結果に等しい変数を設定します。
}

HorizontalはPCのleftキーとrightキー、VerticalはPCのupキーとdownキーの値を受け取ります。

ベクターを作成

Unityでは、3D空間は3次元平面で表され、Vector3を使います。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PlayerMovement : MonoBehaviour
//上のPlayerMovementとは、ファイル名のことです。
{
Vector3 m_Movement;//Vector3をm_Movementに定義

// Start is called before the first frame update
void Start()
{

}

// Update is called once per frame
void Update()
{
float horizontal = Input.GetAxis ("Horizontal");
//新しいフロート変数を作成し、それを水平に呼び出す。このメソッド呼び出しの結果に等しい変数を設定します。
float vertical = Input.GetAxis ("Vertical");
//新しいフロート変数を作成し、それを垂直に呼び出す。このメソッド呼び出しの結果に等しい変数を設定します。
}
}

変数を設定

using System.Collections;

using System.Collections.Generic;

using UnityEngine;public class PlayerMovement : MonoBehaviour
//上のPlayerMovementとは、ファイル名のことです。
{
Vector3 m_Movement;

// Start is called before the first frame update

void Start()
{

}

// Update is called once per frame

void Update()
{
float horizontal = Input.GetAxis ("Horizontal");
//新しいフロート変数を作成し、それを水平に呼び出す。このメソッド呼び出しの結果に等しい変数を設定します。
float vertical = Input.GetAxis ("Vertical");
//新しいフロート変数を作成し、それを垂直に呼び出す。このメソッド呼び出しの結果に等しい変数を設定します。

m_Movement.Set(horizontal, 0f, vertical);

//horizontal=x 0f=y vertical=z
m_Movement.Normalize ();
//ベクター自体のメソッドを呼び出す。

}

}

Animatorコンポーネント

*うまく動かなかった場合は、Unityのバージョンを下げてください。

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class PlayerMovement : MonoBehaviour
//上のPlayerMovementとは、ファイル名のことです。
{
Vector3 m_Movement;
//Vector3をm_Movementに
Animator m_Animator;
//Animatorをm_Animatorに

// Start is called before the first frame update
void Start()
{

}

// Update is called once per frame
void Update()
{
float horizontal = Input.GetAxis ("Horizontal");
//新しいフロート変数を作成し、それを水平に呼び出す。このメソッド呼び出しの結果に等しい変数を設定します。
float vertical = Input.GetAxis ("Vertical");
//新しいフロート変数を作成し、それを垂直に呼び出す。このメソッド呼び出しの結果に等しい変数を設定します。
m_Movement.Set(horizontal, 0f, vertical);
//horizontal=x 0f=y vertical=z
m_Movement.Normalize ();
//ベクター自体のメソッドを呼び出す。
bool hasHorizontalInput = !Mathf.Approximately (horizontal, 0f);
//水平入力があるかどうかを判断する
bool hasVerticalInput = !Mathf.Approximately (vertical, 0f);
//垂直入力があるかどうか判断する
bool isWalking = hasHorizontalInput || hasVerticalInput;
//軸で入力を取得するタイミングを1つのブールに結合する
}

}

キャラクターを回転させる

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PlayerMovement : MonoBehaviour
//上のPlayerMovementとは、ファイル名のことです。
{
public float turnSpeed;
//speedをインスペクターウインドウでいじれるようにする
Vector3 m_Movement;
//Vector3をm_Movementに
Animator m_Animator;
//Animatorをm_Animatorに// Start is called before the first frame update
void Start()
{}// Update is called once per frame
void Update()
{
float horizontal = Input.GetAxis ("Horizontal");
//新しいフロート変数を作成し、それを水平に呼び出す。このメソッド呼び出しの結果に等しい変数を設定します。
float vertical = Input.GetAxis ("Vertical");
//新しいフロート変数を作成し、それを垂直に呼び出す。このメソッド呼び出しの結果に等しい変数を設定します。
m_Movement.Set(horizontal, 0f, vertical);
//horizontal=x 0f=y vertical=z
m_Movement.Normalize ();
//ベクター自体のメソッドを呼び出す。
bool hasHorizontalInput = !Mathf.Approximately (horizontal, 0f);
//水平入力があるかどうかを判断する
bool hasVerticalInput = !Mathf.Approximately (vertical, 0f);
//垂直入力があるかどうか判断する
bool isWalking = hasHorizontalInput || hasVerticalInput;
//軸で入力を取得するタイミングを1つのブールに結合する
Vector3 desiredForward = Vector3.RotateTowards (transform.forward, m_Movement, turnSpeed * Time.deltaTime, 0f);
//フレームごとに値を取得
}
}

キャラクターに動きと回転を追加

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PlayerMovement : MonoBehaviour
//上のPlayerMovementとは、ファイル名のことです。
{
public float turnSpeed;
//speedをインスペクターウインドウでいじれるようにする
Vector3 m_Movement;
//Vector3をm_Movementに
Animator m_Animator;
//Animatorをm_Animatorに
Rigidbody m_Rigidbody;
//Rigidbodyをm_Rigidbodyに
Quaternion m_Rotation = Quaternion.identity;
//回転を取得して保存する// Start is called before the first frame update
void Start()
{
m_Animator = GetComponent<Animator>();
//Animatorへの参照
m_Rigidbody = GetComponent<Rigidbody>();
//Rigidbodyへの参照}// Update is called once per frame
void Update()
{
float horizontal = Input.GetAxis ("Horizontal");
//新しいフロート変数を作成し、それを水平に呼び出す。このメソッド呼び出しの結果に等しい変数を設定します。
float vertical = Input.GetAxis ("Vertical");
//新しいフロート変数を作成し、それを垂直に呼び出す。このメソッド呼び出しの結果に等しい変数を設定します。

m_Movement.Set(horizontal, 0f, vertical);
//horizontal=x 0f=y vertical=z
m_Movement.Normalize ();
//ベクター自体のメソッドを呼び出す。

bool hasHorizontalInput = !Mathf.Approximately (horizontal, 0f);
//水平入力があるかどうかを判断する
bool hasVerticalInput = !Mathf.Approximately (vertical, 0f);
//垂直入力があるかどうか判断する
bool isWalking = hasHorizontalInput || hasVerticalInput;
//軸で入力を取得するタイミングを1つのブールに結合する
m_Animator.SetBool("IsWalking",isWalking);
//設定したばかりのAnimatorコンポーネント参照を使用してSetBoolメソッドを呼び出す

Vector3 desiredForward = Vector3.RotateTowards (transform.forward, m_Movement, turnSpeed * Time.deltaTime, 0f);
//フレームごとに値を取得
m_Rotation = Quaternion.LookRotation (desiredForward);
//LookRotationメソッドを呼び出し、指定されたパラメーターの方向を向く回転を作成する
}

void OnAnimatorMove ()//動きを制御
{
m_Rigidbody.MovePosition (m_Rigidbody.position + m_Movement * m_Animator.deltaPosition.magnitude);
//igidbodyコンポーネントへの参照を使用してそのMovePositionメソッドを呼び出し、単一のパラメーター(新しい位置)を渡す
m_Rigidbody.MoveRotation (m_Rotation);
//回転を直接設定
}

}

更新方法を変更する

UpdateメソッドをFixedUpdateに変更します。

これにより、OnAnimatorMoveに合わせて、呼び出されるようになります。

それでは、実際に実行してみてください。

自分の進みたい方向に、矢印キーで行けるはずです。

まとめ

今回は、実際にスクリプトを作成しUnityでコーディングしました。

やっとーゲームらしくなってきましたね。

次のPartでは、ゲームの環境設定をしていきます。

コメント

タイトルとURLをコピーしました