Unity における高度なプレイヤーの動き
このチュートリアルでは、ダッシュ、しゃがみ、スムーズなカメラ システムなど、Unity の高度なプレイヤー移動メカニズムについて説明します。これらの機能により、プレイヤー コントロールに深みと洗練さが加わり、ゲームプレイ全体のエクスペリエンスが向上します。リアルな動きとインタラクションを実現するために、Unity の物理システムを使用します。
シーンの設定
コーディングに入る前に、プレイヤー オブジェクトとカメラを使用して基本的なシーンを設定しましょう。
- 新しい Unity プロジェクトを作成します。
- 階層で 3D キューブを作成し、名前を Player に変更し、キャラクターに似るようにスケールします (例: X: 1、Y: 2、Z: 1)。
- スムーズな物理特性を実現するために、
Rigidbody
コンポーネントをプレーヤーに追加し、Interpolate
プロパティをInterpolate
に設定します。 Capsule Collider
コンポーネントを追加し、その高さと半径をプレーヤー モデルに合わせて調整します。- 空の GameObject を作成し、CameraRig という名前を付けて、それに Camera をアタッチします。カメラをプレイヤーの後ろ、少し上に配置します。
- CameraRig を Player オブジェクトの子にして、その動きを追跡します。
高度なプレイヤーの動きを実装する
基本的な移動、ダッシュ、しゃがみ、スムーズなカメラ回転を処理するスクリプトを実装します。
プレイヤー移動スクリプト
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
public float walkSpeed = 5f;
public float sprintSpeed = 10f;
public float crouchSpeed = 2.5f;
public float jumpForce = 5f;
public float gravity = 20f;
public Transform cameraTransform;
public float lookSensitivity = 2f;
public float maxLookAngle = 80f;
private Rigidbody rb;
private float currentSpeed;
private bool isCrouching = false;
private bool isGrounded = false;
private void Start()
{
rb = GetComponent();
rb.freezeRotation = true; // Prevent the Rigidbody from rotating
}
private void Update()
{
HandleMovement();
HandleJumping();
HandleCrouching();
HandleCameraRotation();
}
private void HandleMovement()
{
float moveHorizontal = Input.GetAxis("Horizontal");
float moveVertical = Input.GetAxis("Vertical");
Vector3 move = transform.right * moveHorizontal + transform.forward * moveVertical;
move = move.normalized * currentSpeed * Time.deltaTime;
Vector3 velocity = rb.velocity;
velocity.x = move.x;
velocity.z = move.z;
rb.velocity = velocity;
}
private void HandleJumping()
{
if (Input.GetButtonDown("Jump") && isGrounded)
{
rb.velocity = new Vector3(rb.velocity.x, jumpForce, rb.velocity.z);
}
}
private void HandleCrouching()
{
if (Input.GetKeyDown(KeyCode.LeftControl))
{
isCrouching = !isCrouching;
currentSpeed = isCrouching ? crouchSpeed : walkSpeed;
transform.localScale = new Vector3(1, isCrouching ? 0.5f : 1, 1);
}
if (Input.GetKey(KeyCode.LeftShift) && !isCrouching)
{
currentSpeed = sprintSpeed;
}
else if (!isCrouching)
{
currentSpeed = walkSpeed;
}
}
private void HandleCameraRotation()
{
float mouseX = Input.GetAxis("Mouse X") * lookSensitivity;
float mouseY = Input.GetAxis("Mouse Y") * lookSensitivity;
Vector3 rotation = cameraTransform.localEulerAngles;
rotation.y += mouseX;
rotation.x -= mouseY;
rotation.x = Mathf.Clamp(rotation.x, -maxLookAngle, maxLookAngle);
cameraTransform.localEulerAngles = rotation;
}
private void OnCollisionStay(Collision collision)
{
if (collision.gameObject.CompareTag("Ground"))
{
isGrounded = true;
}
}
private void OnCollisionExit(Collision collision)
{
if (collision.gameObject.CompareTag("Ground"))
{
isGrounded = false;
}
}
}
主な特徴と説明
動きと速度の制御
このスクリプトは、Unity の Rigidbody
を使用してプレイヤーを移動し、物理ベースのインタラクションを可能にします。速度は、プレイヤーが歩いているか、全力疾走しているか、しゃがんでいるかによって異なります。しゃがみは LeftControl
キーで切り替えられ、全力疾走は LeftShift
キーを押しながら行います。
ジャンピング
HandleJumping
メソッドは、プレイヤーが地面に着地している場合、プレイヤーがジャンプ ボタン (デフォルト: スペース バー) を押したときに上向きの力を適用します。地面の検出は、"Ground" タグが付けられたオブジェクトとの衝突をチェックすることによって処理されます。
カメラコントロール
カメラの回転はマウスを使用して制御され、カメラの位置に基づいて一人称視点または三人称視点が提供されます。視点の角度は、プレイヤーの方向感覚を失わせる可能性のある過度の傾きを防ぐために固定されています。
結論
このチュートリアルでは、物理ベースのコントロール、スプリント、しゃがみ、カメラ管理など、さまざまな側面をカバーしながら、Unity での高度なプレイヤーの動きの基礎を説明します。これらのテクニックは、さまざまなゲームのジャンルやスタイルに合わせてさらにカスタマイズおよび拡張でき、応答性の高いリアルなコントロールでプレイヤーのエクスペリエンスを向上できます。
プレイヤーの動きはゲームプレイの重要な要素であり、満足のいくプレイヤー体験を保証するために慎重に調整する必要があることに注意してください。さまざまな値と機能を試して、プロジェクトに最適な設定を見つけてください。