14.摄像机跟随人物

  1. 14.游戏场景-摄像机跟随逻辑
    1. 14.1 知识点
      1. 由于人物模型是动态生成的,不太好直接把摄像机做成人物模型子对象。要用代码逻辑计算出摄像机的位置。可以通过向量计算。
      2. 创建CameraMove摄像机移动脚本,继承MonoBehaviour,挂载到游戏场景摄像机上
      3. CameraMove脚本中定义一些公共变量和属性:摄像机要看向的目标对象的Transform组件变量target。摄像机相对目标对象在xyz轴上的偏移位置的Vector3变量offsetPos。看向位置的y偏移值,可以理解为身体有多高,调整身体的高度会改变摄像机的角度变量bodyHeight。摄像机的移动和旋转速度变量moveSpeed和rotationSpeed。摄像机应该在的目标位置和目标角度变量targetPos和targetRotation。
      4. Update()中,检查是否有目标对象,如果没有则返回。根据目标对象计算摄像机当前的位置和角度。将目标位置朝向目标对象的正方向与偏移位置的z坐标相乘得到朝后偏移的位置。加上目标对象的上方向与偏移位置的y坐标相乘得到朝上偏移的位置。加上目标对象的右方向与偏移位置的x坐标相乘得到左右偏移的位置。使用插值运算让摄像机不停地向目标点靠拢,更新摄像机的位置。使用Quaternion.LookRotation()方法得到最终要看向某个点时的四元数,参数为目标位置。使用四元数的插值运算让摄像机不停地向目标角度靠拢,更新摄像机的角度。
      5. 定义用于设置摄像机看向的目标对象方法public void SetTarget(Transform player)
    2. 14.2 知识点代码

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

×

喜欢就点赞,疼爱就打赏