UnityのTutorialで学んだ内容を復習したり、自分なりに改変する時のために
最小限の要素で構成したプロジェクトを用意しました。
元のプロジェクトで作業を行うと他の要素が邪魔になったり、バグの原因特定が困難になることがあるためです。
この環境でできる内容を以下の通りです。
- 方向キーでキャラクターを移動させる
- カメラがキャラクターに追尾する
今後3Dゲームの内容に関して、このプロジェクトに追加していく形で学習したことをアウトプットして行こうと考えています。
Player.cs
public class Player : MonoBehaviour
{
public float m_Speed = 6f; // 移動速度
Animator m_Animator;
Rigidbody m_Rigidbody;
Vector3 m_Movement;
void Awake ()
{
m_Animator = GetComponent<Animator> ();
m_Rigidbody = GetComponent<Rigidbody> ();
}
void FixedUpdate ()
{
// キー入力の取得
float h = Input.GetAxisRaw ("Horizontal");
float v = Input.GetAxisRaw ("Vertical");
// キー入力からベクトルを設定する
m_Movement.Set (h, 0f, v);
Move ();
Turn ();
Animate ();
}
private void Move ()
{
// ベクトルから移動量を取得する
m_Movement = m_Movement.normalized * m_Speed * Time.deltaTime;
m_Rigidbody.MovePosition (transform.position + m_Movement);
}
private void Turn ()
{
// 移動中でなければ回転処理は行わない
if (!isRunning ())
// NOP.
return;
// ベクトルから回転方向を取得する
Quaternion targetRotation = Quaternion.LookRotation (m_Movement);
// 回転処理
transform.rotation = Quaternion.RotateTowards (transform.rotation, targetRotation, 360.0f * Time.deltaTime);
}
private void Animate ()
{
// 走るアニメーションの有効、無効化
m_Animator.SetBool ("Running", isRunning ());
}
private bool isRunning ()
{
// ベクトルの長さでキャラクターが移動中か判断する
return m_Movement.magnitude != 0f;
}
}
CameraController.cs
public class CameraController : MonoBehaviour {
public Transform m_Target; // カメラの追尾対象(プレイヤー)の位置
public float m_Smoothing = 5f; // カメラの追尾速度
private Vector3 offset; // カメラからm_Targetまでの距離、
// カメラは常にプレイヤーからoffset分の距離を保つことになる
void Start ()
{
// プレイヤーの初期位置からoffsetを初期化する
offset = transform.position - m_Target.position;
}
void FixedUpdate ()
{
// プレイヤーの位置から追尾後のカメラ位置を算出する
Vector3 targetCamPos = m_Target.position + offset;
// プレイヤーの位置を元にカメラを移動させる
transform.position = Vector3.Lerp (transform.position, targetCamPos, m_Smoothing * Time.deltaTime);
}
}
ソースコードはGitHubにアップロードしています。
敵(障害物)を追加するに続きます。