MySingleCameraTarget
using UnityEngine;
public class MySingleCameraTarget : MonoBehaviour
{
[Header("视图逻辑前向")]
public Vector3 viewForward;
[Header("仅有Yaw纵向轴旋转量的向前方向")]
public Vector3 onlyYawForward;
[Header("相对onlyYawForward的右边方向")]
public Vector3 right;
}
MySimpleCameraController
using UnityEngine;
public class MySimpleCameraController : MonoBehaviour
{
public Transform cam;
public MySingleCameraTarget followTarget;
public Transform camPosMarker;
public float camBackwardDistance = 5.0f;
public float camUpDistance = 1.0f;
public void LateUpdate()
{
Vector3 targetForward = followTarget.viewForward;
Vector3 targetUp = Vector3.Cross(targetForward, Vector3.right);
Vector3 targetBackward = -targetForward;
Vector3 targetPos = followTarget.transform.position;
Vector3 camPos = targetPos + targetBackward * camBackwardDistance + targetUp * camUpDistance;
cam.position = camPos;
camPosMarker.position = camPos;
cam.forward = (targetPos - camPos).normalized;
}
}
MySimplePlayerController
using TMPro;
using UnityEngine;
public class MySimplePlayerController : MonoBehaviour
{
public TextMeshProUGUI text;
[Header("需要控制的 CharacterController")]
public CharacterController character;
[Header("玩家类")]
public MySingleCameraTarget player;
[Header("镜头旋转敏感度")]
public float cam_rotation_sensitivity = 100.0f;
[Header("移动速度")]
public float move_speed = 1.0f;
[Header("跳跃强度")]
public float jump_power = 1.0f;
private Rigidbody R;
private bool controlling = true;
private float yaw;
private float pitch;
private void Start()
{
R = character.GetComponent<Rigidbody>();
}
private void Update()
{
CommonInputHandle();
}
private void CommonInputHandle()
{
if (Input.GetKeyDown(KeyCode.T))
{
controlling = !controlling;
Debug.Log($"toggle controllering, controlling : {controlling}");
}
if (controlling)
{
ControlInputHandle();
text.text = "Controlling, press [T] Key to Exit Control.";
}
else
{
text.text = "un Controlling, press [T] Key to Enter Control.";
}
}
private void ControlInputHandle()
{
float yawDelta = Input.GetAxis("Mouse X");
float pitchDelta = Input.GetAxis("Mouse Y");
float moveHorizontal = Input.GetAxisRaw("Horizontal");
float moveVertical = Input.GetAxisRaw("Vertical");
if (yawDelta != 0.0f || pitchDelta != 0.0f)
{
yaw += yawDelta * Time.deltaTime * cam_rotation_sensitivity;
pitch -= pitchDelta * Time.deltaTime * cam_rotation_sensitivity;
pitch = Mathf.Clamp(pitch, -60.0f, 60.0f);
player.viewForward = Quaternion.Euler(pitch, yaw, 0) * Vector3.forward;
player.onlyYawForward = Quaternion.Euler(0, yaw, 0) * Vector3.forward;
player.right = Vector3.Cross(player.onlyYawForward, Vector3.up);
transform.forward = player.onlyYawForward;
}
Vector3 moveVec = (player.onlyYawForward * moveVertical + -player.right * moveHorizontal).normalized * move_speed;
transform.position += moveVec;
}
}
References