ThirdPersonでのプレイヤーの移動のために、以下のスクリプトを書きました。
using System.Collections; using System.Collections.Generic; using UnityEngine; namespace CSharpScript { public class UnkomanControl2 : MonoBehaviour { float inputX; float inputZ; Rigidbody Rb; float moveSpeed = 7f; void Start() { Rb = GetComponent<Rigidbody>(); } void Update() { inputX = Input.GetAxis("Horizontal"); inputZ = Input.GetAxis("Vertical"); } void FixedUpdate() { Vector3 cameraForward = Vector3.Scale(Camera.main.transform.forward, new Vector3(1, 0, 1)).normalized; Vector3 moveForward = cameraForward * inputZ + Camera.main.transform.right * inputX; Rb.velocity = (moveForward * moveSpeed); if(inputX != 0f) { transform.rotation = Quaternion.LookRotation(moveForward, Vector3.up); } if(inputZ != 0f) { transform.rotation = Quaternion.LookRotation(moveForward, Vector3.up); } } } }
X入力、Z入力による移動方向をカメラの視点に合わせるスクリプトです。
カメラはキャラの子にはせず、別で追従するスクリプトをつけてあります。
ですが、このスクリプトだと以下の欠点があり、使い物にならず困っています。
・X入力とZ入力で移動すると徐々に空中に浮く
・移動により空中に浮いた状態で静止させると、プレイヤーオブジェクトがX軸に回転しながらゆっくり降りていく
・プレイヤーオブジェクトのローカル座標の+Z方向に進もうとすると突っかかって進めないときがある
このスクリプトのどの部分が悪いのか、分かる方教えてください。
下は回答頂いたスクリプトを適用したものです。
using System.Collections; using System.Collections.Generic; using UnityEngine; namespace CSharpScript { public class UnkomanControl2 : MonoBehaviour { float inputX; float inputZ; Rigidbody Rb; float moveSpeed = 7f; void Start() { Rb = GetComponent<Rigidbody>(); } void Update() { inputX = Input.GetAxis("Horizontal"); inputZ = Input.GetAxis("Vertical"); } void FixedUpdate() { Vector3 cameraForward = Vector3.Scale(Camera.main.transform.forward, new Vector3(1, 0, 1)).normalized; Vector3 cameraRight = Vector3.Scale(Camera.main.transform.right, new Vector3(1, 0, 1)).normalized; Vector3 moveForward = cameraForward * inputZ + cameraRight * inputX; Rb.velocity = moveForward * moveSpeed + new Vector3(0, Rb.velocity.y); if(moveForward.magnitude != 0f) { transform.rotation = Quaternion.LookRotation(moveForward); } } } }
回答1件
あなたの回答
tips
プレビュー