14.游戏场景-摄像机跟随逻辑
14.1 知识点
由于人物模型是动态生成的,不太好直接把摄像机做成人物模型子对象。要用代码逻辑计算出摄像机的位置。可以通过向量计算。
创建CameraMove摄像机移动脚本,继承MonoBehaviour,挂载到游戏场景摄像机上
CameraMove脚本中定义一些公共变量和属性:摄像机要看向的目标对象的Transform组件变量target。摄像机相对目标对象在xyz轴上的偏移位置的Vector3变量offsetPos。看向位置的y偏移值,可以理解为身体有多高,调整身体的高度会改变摄像机的角度变量bodyHeight。摄像机的移动和旋转速度变量moveSpeed和rotationSpeed。摄像机应该在的目标位置和目标角度变量targetPos和targetRotation。
//摄像机要看向的目标对象
public Transform target;
//摄像机相对目标对象 在xyz上的偏移位置
public Vector3 offsetPos;
//看向位置的y偏移值 可以理解为身体有多高 调整身体的高度会改变摄像机的角度
public float bodyHeight;
//移动和旋转速度
public float moveSpeed;
public float rotationSpeed;
//摄像机的应该要在的目标位置和目标角度
private Vector3 targetPos;
private Quaternion targetRotation;
Update()中,检查是否有目标对象,如果没有则返回。根据目标对象计算摄像机当前的位置和角度。将目标位置朝向目标对象的正方向与偏移位置的z坐标相乘得到朝后偏移的位置。加上目标对象的上方向与偏移位置的y坐标相乘得到朝上偏移的位置。加上目标对象的右方向与偏移位置的x坐标相乘得到左右偏移的位置。使用插值运算让摄像机不停地向目标点靠拢,更新摄像机的位置。使用Quaternion.LookRotation()方法得到最终要看向某个点时的四元数,参数为目标位置。使用四元数的插值运算让摄像机不停地向目标角度靠拢,更新摄像机的角度。
void Update()
{
if (target == null)
return;
//根据目标对象 来计算 摄像机当前的位置和角度
//位置的计算
//向后偏移Z坐标 Z填负数
targetPos = target.position + target.forward * offsetPos.z;
//向上偏移Y坐标
targetPos += Vector3.up * offsetPos.y;
//左右偏移X坐标
targetPos += target.right * offsetPos.x;
//插值运算 让摄像机 不停向目标点靠拢
this.transform.position = Vector3.Lerp(this.transform.position, targetPos, moveSpeed * Time.deltaTime);
//旋转的计算
//得到最终要看向某个点时的四元数 表示目标位置相对于摄像机位置的方向向量。 方法接受一个方向向量作为参数,并返回一个四元数,该四元数描述了旋转方向,使得摄像机朝向这个方向。
targetRotation = Quaternion.LookRotation(target.position + Vector3.up * bodyHeight - this.transform.position);
//四元数的插值运算 让摄像机不停的向目标角度靠拢
this.transform.rotation = Quaternion.Slerp(this.transform.rotation, targetRotation, rotationSpeed * Time.deltaTime);
}
定义用于设置摄像机看向的目标对象方法public void SetTarget(Transform player)
/// <summary>
/// 设置摄像机看向的目标对象
/// </summary>
/// <param name="player"></param>
public void SetTarget(Transform player)
{
target = player;
}
14.2 知识点代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraMove : MonoBehaviour
{
//摄像机要看向的目标对象
public Transform target;
//摄像机相对目标对象 在xyz上的偏移位置
public Vector3 offsetPos;
//看向位置的y偏移值 可以理解为身体有多高 调整身体的高度会改变摄像机的角度
public float bodyHeight;
//移动和旋转速度
public float moveSpeed;
public float rotationSpeed;
//摄像机的应该要在的目标位置和目标角度
private Vector3 targetPos;
private Quaternion targetRotation;
void Update()
{
if (target == null)
return;
//根据目标对象 来计算 摄像机当前的位置和角度
//位置的计算
//向后偏移Z坐标 Z填负数
targetPos = target.position + target.forward * offsetPos.z;
//向上偏移Y坐标
targetPos += Vector3.up * offsetPos.y;
//左右偏移X坐标
targetPos += target.right * offsetPos.x;
//插值运算 让摄像机 不停向目标点靠拢
this.transform.position = Vector3.Lerp(this.transform.position, targetPos, moveSpeed * Time.deltaTime);
//旋转的计算
//得到最终要看向某个点时的四元数 表示目标位置相对于摄像机位置的方向向量。 方法接受一个方向向量作为参数,并返回一个四元数,该四元数描述了旋转方向,使得摄像机朝向这个方向。
targetRotation = Quaternion.LookRotation(target.position + Vector3.up * bodyHeight - this.transform.position);
//四元数的插值运算 让摄像机不停的向目标角度靠拢
this.transform.rotation = Quaternion.Slerp(this.transform.rotation, targetRotation, rotationSpeed * Time.deltaTime);
}
/// <summary>
/// 设置摄像机看向的目标对象
/// </summary>
/// <param name="player"></param>
public void SetTarget(Transform player)
{
target = player;
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com