移动脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayMovement: MonoBehaviour
{
public float moveSpeed = 6f;
public float turnSpeed = 20f;
public Transform camTf;
float horizontal;
float vertical;
Vector3 camForward;
Quaternion m_Rotation = Quaternion.identity;//旋转四元数
void FixedUpdate()
{
horizontal = Input.GetAxis("Horizontal");//水平输入AD
vertical = Input.GetAxis("Vertical");//竖直输入WS
transform.Translate(camTf.right * horizontal * moveSpeed * Time.deltaTime + camForward * vertical * moveSpeed * Time.deltaTime, Space.World);
//判断是否移动
bool hasHorizontalInput = !Mathf.Approximately(horizontal, 0f);//是否有水平输入
bool hasVerticalInput = !Mathf.Approximately(vertical, 0f);//是否有竖直输入
bool IsWalking = hasHorizontalInput || hasVerticalInput;
if (IsWalking)
{
Rotating(horizontal, vertical);
}
}
void Rotating(float h, float v)
{
camForward = Vector3.Cross(camTf.right, Vector3.up);
Vector3 targetDir = camTf.right * h + camForward * v;
m_Rotation = Quaternion.LookRotation(targetDir, Vector3.up);
transform.rotation = Quaternion.Lerp(transform.rotation, m_Rotation, turnSpeed * Time.deltaTime);
}
}
摄像机跟随脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Move : MonoBehaviour
{
public Transform player;
public float xSpeed = 200; //水平速度
public float ySpeed = 200; //垂直速度
public float mSpeed = 10; //调整视距速度
public float yMinLimit = -50;
public float yMaxLimit = 50;
public float distance = 10; //视距
public float minDistance = 2;
public float maxDistance = 30;
public bool needDamping = false; //平滑阻尼
float damping = 5.0f; //平滑速度
public float x = 0.0f; //水平旋转角
public float y = 0.0f; //垂直旋转角
void Start()
{
Vector3 angles = transform.eulerAngles;
x = angles.y; //水平旋转绕y轴
y = angles.x; //垂直旋转绕x轴
}
void LateUpdate()
{
if (player)
{
if (Input.GetMouseButton(1))
{
x += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
y = ClampAngle(y, yMinLimit, yMaxLimit);
}
distance -= Input.GetAxis("Mouse ScrollWheel") * mSpeed; //滚轮调整视距
distance = Mathf.Clamp(distance, minDistance, maxDistance);
Quaternion rotation = Quaternion.Euler(y, x, 0.0f);
Vector3 disVector = new Vector3(0.0f, 0.0f, -distance);
Vector3 position = rotation * disVector + player.position;
//通过插值平滑
if (needDamping)
{
transform.rotation = Quaternion.Lerp(transform.rotation, rotation, Time.deltaTime * damping);
transform.position = Vector3.Lerp(transform.position, position, Time.deltaTime * damping);
}
else
{
transform.position = position;
transform.rotation = rotation;
}
}
}
//计算夹角
static float ClampAngle(float angle, float min, float max)
{
if (angle < -360)
angle += 360;
if (angle > 360)
angle -= 360;
return Mathf.Clamp(angle, min, max);
}
}