Unity 3D 人物移动朝向跟随摄像机(第一人称)

原理

以人物身体旋转控制镜头左右滑动
以摄像机旋转控制镜头上下滑动

详细解析

首先我们要知道 摄像机是作为人物的子物体的(充当眼睛)
所以当人物旋转时 摄像机会跟随它朝相同的方向旋转相同的角度
从而达到 眼睛(摄像机)注视的方向一定是人物的正前方

那么这样做有什么好处呢?
若摄像机镜头锁定为人物正前方
操控人物的移动方向就会变得非常精准

如果只单纯以摄像机来控制镜头的上下左右滑动
虽然这样也能实现全方位的第一视角
但当人物移动时 就会出现方向的错误
因为此时虽然镜头朝向变了 人物朝向却没有变
例如:你将镜头向左转90度,按 W 准备向前走,却发现向右移动了(初始方向的前)
在这里插入图片描述

所以想要移动方向精准 摄像机朝向必须和人物朝向一致
在这里插入图片描述
*注意区别两幅图人物和摄像机的朝向

代码讲解

核心部分

//俯仰
//以摄像机的旋转控制镜头上下滑动
void Pitch()
{
  float pitchAngle = Input.GetAxis("Mouse Y") * pitchSensitivity * Time.deltaTime;
  Quaternion pitch = Quaternion.AngleAxis(pitchAngle, -Vector3.right); //绕X轴负方向旋转的度数
  Quaternion finalAngle = playerCam.localRotation * pitch; //欧拉角转化为四元数 使摄像机旋转

  //限定俯仰的角度
  if (Quaternion.Angle(playerCamCenter, finalAngle) < pitchLimit)
  {
    playerCam.localRotation = finalAngle;//赋值
  }
}

//偏转
//以人物的旋转控制镜头左右滑动
void Yaw()
{
  float yawAngle = Input.GetAxis("Mouse X") * yawSensitivity * Time.deltaTime;
  Quaternion yaw = Quaternion.AngleAxis(yawAngle, Vector3.up); //绕Y轴旋转的度数
  Quaternion finalAngle = player.localRotation * yaw; //欧拉角转化为四元数 使人物旋转

  player.localRotation =finalAngle;//赋值
}

详细解析

获取人物和摄像机

public Transform player;
public Transform playerCam;

设定俯仰和偏转的灵敏度(俯仰、偏转的具体讲解在上期文章)

public float pitchSensitivity; //Y方向 俯仰(绕X轴)
public float yawSensitivity; //X方向 偏转(绕Y轴)

限定最大俯仰角度(水平方向上的偏转不用限制)

public float pitchLimit = 75;

计算旋转角度

float pitchAngle = Input.GetAxis("Mouse Y") * pitchSensitivity * Time.deltaTime;
float yawAngle = Input.GetAxis("Mouse X") * yawSensitivity * Time.deltaTime;

绕指定的轴进行旋转

Quaternion pitch = Quaternion.AngleAxis(pitchAngle, -Vector3.right);//绕X轴负方向旋转的度数
Quaternion yaw = Quaternion.AngleAxis(yawAngle, Vector3.up); //绕Y轴旋转的度数

理解 Quaternion.AngleAxis

Quaternion:四元数 这个在Unity中基本就是用于计算方位、旋转的
AngleAxis:围绕的一个轴
整体就是:指定一个轴,围绕该轴旋转指定的角度,得到一个新的旋转结果

targetRotation = Quaternion.AngleAxis(angel, direction);

angle:代表旋转多少度
direction:围绕哪个轴的哪个方向(如Vector3.up、Vector3.right等)

将欧拉角转换为四元数

Quaternion finalAngle = playerCam.localRotation * pitch;
Quaternion finalAngle = player.localRotation * yaw;

完成最终赋值
摄像机

if (Quaternion.Angle(playerCamCenter, finalAngle) < pitchLimit)
        {
            playerCam.localRotation = finalAngle;
        }

人物

player.localRotation =finalAngle;

完整代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerLookControl : MonoBehaviour
{
    //获取摄像机和人物
    public Transform player;
    public Transform playerCam;

    //俯仰和偏转的灵敏度
    public float pitchSensitivity; //Y方向 俯仰(绕X轴)
    public float yawSensitivity; //X方向 偏转(绕Y轴)

    //最大俯仰角度
    public float pitchLimit = 75;

    private Quaternion playerCamCenter;

    void Start()
    {
        playerCamCenter = playerCam.localRotation;
        Cursor.lockState = CursorLockMode.Locked; //将鼠标光标锁定在窗口中心
        Cursor.visible = false; //隐藏鼠标光标
    }

    void Update()
    {
        Pitch();
        Yaw();
    }

    //俯仰
    //以摄像机的旋转控制镜头上下滑动
    void Pitch()
    {
        float pitchAngle = Input.GetAxis("Mouse Y") * pitchSensitivity * Time.deltaTime;
        Quaternion pitch = Quaternion.AngleAxis(pitchAngle, -Vector3.right); //绕X轴负方向旋转的度数
        Quaternion finalAngle = playerCam.localRotation * pitch; //欧拉角转化为四元数 使摄像机旋转

        //限定俯仰的角度
        if (Quaternion.Angle(playerCamCenter, finalAngle) < pitchLimit)
        {
            playerCam.localRotation = finalAngle;//赋值
        }
    }

    //偏转
    //以人物的旋转控制镜头左右滑动
    void Yaw()
    {
        float yawAngle = Input.GetAxis("Mouse X") * yawSensitivity * Time.deltaTime;
        Quaternion yaw = Quaternion.AngleAxis(yawAngle, Vector3.up); //绕Y轴旋转的度数
        Quaternion finalAngle = player.localRotation * yaw; //欧拉角转化为四元数 使人物旋转

        player.localRotation =finalAngle;//赋值
    }
}
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity中实现摄像机跟随人物,可以使用以下两种方式: 1. 通过脚本控制摄像机位置和旋转 可以在摄像机上添加一个脚本,通过脚本代码实现摄像机跟随人物的效果。具体实现步骤如下: 1)获取人物的Transform组件,即人物的位置和旋转信息。 2)将摄像机的位置和旋转信息设置为人物的位置和旋转信息,可以通过Vector3.Lerp()方法实现平滑跟随。 3)在Update()方法中不断更新摄像机的位置和旋转信息,从而实现摄像机跟随效果。 示例代码: ``` public class CameraFollow : MonoBehaviour { public Transform target; // 人物的Transform组件 public float smoothTime = 0.3f; // 平滑跟随时间 private Vector3 velocity = Vector3.zero; void Update() { // 计算摄像机新的位置 Vector3 targetPosition = target.TransformPoint(new Vector3(0, 5, -10)); // 平滑跟随 transform.position = Vector3.SmoothDamp(transform.position, targetPosition, ref velocity, smoothTime); // 计算摄像机新的旋转角度 transform.LookAt(target); } } ``` 2. 使用Unity跟随组件 Unity提供了一个跟随组件(Follow),可以通过简单的配置实现摄像机跟随人物的效果。具体实现步骤如下: 1)在摄像机上添加一个跟随组件(Component -> New Script -> Follow)。 2)将跟随组件的Target设置为人物的Transform组件。 3)调整跟随组件的其他参数,例如跟随速度、距离等。 示例代码: ``` using UnityEngine; using UnityStandardAssets.Utility; public class CameraFollow : MonoBehaviour { public Transform target; // 人物的Transform组件 public float distance = 10f; // 摄像机人物的距离 public float height = 5f; // 摄像机人物的高度 public float damping = 1f; // 跟随速度 private FollowTarget followTarget; void Start() { followTarget = GetComponent<FollowTarget>(); followTarget.target = target; followTarget.distance = distance; followTarget.height = height; followTarget.damping = damping; } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值