U3D游戏第一视角和第三视角
Vector3.Lerp平移摄像机(第三视角)
Vector3.lerp主要是线性插值:(from:Vector3,to:Vector3,float:速度)
首先创建一个脚本move,定义这几个:
private Transform cam;//需要跟踪的摄像机
private Transform player;//角色位置
Vector3 offsen;//摄像机到角色位置的差量
Vector3 Toposition;
float speed = 10f;
在Start()初始化
void Start()
{
player = this.transform;
cam = GameObject.Find("Main Camera").GetComponent<Transform>();//获取摄像机
offsen = gameObject.transform.position- cam.transform.position;//得到差量
}
在Update()具体实现
void Update()
{
if (Input.GetKey(KeyCode.W))
{
player.transform.Translate(Vector3.forward * Time.deltaTime);
}
Toposition = player.transform.position + player.TransformDirection(offsen);//把这个差量通过主角的位置计算出来
cam.transform.position = Vector3.Lerp(cam.transform.position, Toposition, speed * Time.deltaTime);//(from:Vector3,to:Vector3,float:速度)
cam.transform.LookAt(player);//让摄像机始终朝向角色
}
完整代码
using UnityEngine;
public class move : MonoBehaviour
{
private Transform cam;//需要跟踪的摄像机
private Transform player;//角色
Vector3 offsen;//差值
Vector3 Toposition;
float speed = 10f;
// Start is called before the first frame update
void Start()
{
player = this.transform;
cam = GameObject.Find("Main Camera").GetComponent<Transform>();
offsen = gameObject.transform.position- cam.transform.position;
}
// Update is called once per frame
void Update()
{
if (Input.GetKey(KeyCode.W))
{
player.transform.Translate(Vector3.forward * Time.deltaTime);
}
Toposition = player.transform.position + player.TransformDirection(offsen);
cam.transform.position = Vector3.Lerp(cam.transform.position, Toposition, speed * Time.deltaTime);
cam.transform.LookAt(player);
}
}
角色的Transform赋给摄像机(第一视角)
直接上代码
首先创建一个脚本move,定义这几个:
// An highlighted block
private Transform cam;//摄像机
private Transform player;//角色
Vector3 camrot;//摄像机的角度
在Start()里面初始化
// An highlighted block
void Start()
{
player = this.transform;
cam = GameObject.Find("Main Camera").GetComponent<Transform>();
cam.transform.position = player.TransformPoint(0, 0, -0.2f);//把角色的位置初始给摄像机
cam.rotation = player.rotation;
camrot= player.eulerAngles;//把角色的欧拉角给摄像机
}
在Update()里面实现旋转
// An highlighted block
void Update()
{
if (Input.GetKey(KeyCode.W))
{
player.transform.Translate(Vector3.forward * Time.deltaTime);
}
//控制摄像机
float x = Input.GetAxis("Mouse X");//获取鼠标在X轴上的移动量
float y = Input.GetAxis("Mouse Y");//获取鼠标在Y轴上的移动量
camrot.x -= y;//围绕世界坐标X轴旋转,这里要考虑世界坐标和屏幕坐标了,虽然我们的世界坐标是在增加,但是我们的视角是在向下,所以要减
camrot.y += x;//围绕世界坐标Y轴旋转,同理
cam.transform.eulerAngles = camrot;
Vector3 rot = cam.transform.eulerAngles;
rot.z = 0;
player.eulerAngles = rot;//把摄像机的欧拉角赋给角色
cam.transform.position = player.TransformPoint(0, 0, -0.2f);
}
完整代码
// An highlighted block
using UnityEngine;
public class move : MonoBehaviour
{
private Transform cam;//摄像机
private Transform player;//角色
Vector3 camrot;
// Start is called before the first frame update
void Start()
{
player = this.transform;
cam = GameObject.Find("Main Camera").GetComponent<Transform>();
cam.transform.position = player.TransformPoint(0, 0, -0.2f);
cam.rotation = player.rotation;
camrot= player.eulerAngles;
}
// Update is called once per frame
void Update()
{
if (Input.GetKey(KeyCode.W))
{
player.transform.Translate(Vector3.forward * Time.deltaTime);
}
//控制摄像机
float x = Input.GetAxis("Mouse X");
float y = Input.GetAxis("Mouse Y");
camrot.x -= y;
camrot.y += x;
cam.transform.eulerAngles = camrot;
Vector3 rot = cam.transform.eulerAngles;
rot.z = 0;
player.eulerAngles = rot;
cam.transform.position = player.TransformPoint(0, 0, -0.2f);
}
}