Unity3D之第三人称视角相机跟随

前言

这次实现类似绝地求生这个游戏中的 第三人称视角相机跟随

角色层级

直接把相机挂载到角色模型作为子级

调整好角度与位置,初步实现第三人称视角

挂载脚本

  • PlayerController.cs 挂载到Player
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
  public float rotationSpeed = 200f;
  private float mouseX;
  private float mouseY;

  void Start()
  {
    Cursor.lockState = CursorLockMode.Locked;
    Cursor.visible = false;
  }

  void Update()
  {
  	mouseX = Input.GetAxis("Mouse X") * rotationSpeed * Time.deltaTime;
    transform.Rotate(new Vector3(0f, mouseX, 0f), Space.Self);

    mouseY -= Input.GetAxis("Mouse Y") * rotationSpeed * Time.deltaTime;
    mouseY = Mathf.Clamp(mouseY, -40f, 40f);
    Camera.main.transform.localEulerAngles = new Vector3(mouseY, 0, 0);
  }
}

实现效果

后话

对不同的需求有不同的相机跟随的实现方法,灵活运用才是正解

Enjoy~

<think>嗯,用户想在Unity3D中实现相机跟随人物视角转向的功能。我需要先回忆一下相关的实现方法。通常,这种功能在第三人称游戏中很常见,比如当角色转向时,相机也会跟着旋转。 首先,可能需要将相机作为角色的子物体。这样的话,相机会自动跟随角色的位置和旋转变化。不过,这样可能太简单了,用户可能需要更平滑的跟随效果,或者在旋转时有延迟,比如像一些动作游戏中的相机跟随。 另外,可能还需要考虑使用脚本控制相机的旋转。比如,通过获取角色的旋转角度,然后让相机逐步插值到目标旋转,这样会有平滑过渡的效果。或者使用Unity的Cinemachine插件,它提供了更强大的相机控制功能,比如FreeLook Camera,可以方便地实现跟随和旋转。 不过,用户可能希望用原生的方法,不使用插件。所以需要编写脚本。记得之前学过,可以通过在LateUpdate中更新相机的位置和旋转,这样可以确保在角色移动后再处理相机的移动,避免抖动。 然后,可能涉及到相机的相对位置,比如保持一定距离,跟随角色背后。这时候可能需要调整相机的偏移量,或者使用Quaternion来旋转这个偏移量,使得当角色转向时,相机也绕角色旋转。 还有,用户可能需要处理输入,比如鼠标或手柄的输入来控制视角旋转。这时候需要将输入传递给角色或相机的旋转。比如,角色根据水平输入旋转,相机根据垂直输入上下转动,但保持跟随角色的水平旋转。 另外,引用中的内容可能有帮助。比如引用[5]提到了在Unity中处理关卡加载时的位置重置,这可能与相机的初始化位置有关,但当前问题主要是跟随旋转,可能暂时不需要这部分。引用[2]提到插入3D物体,可能和场景设置相关,但相机跟随属于脚本控制。 需要确保相机的旋转与角色的旋转同步。如果角色使用Character Controller,可能需要直接获取其transform.rotation,并应用到相机上。或者,当角色转向时,通过脚本来控制相机的旋转速度,实现平滑跟随。 可能的步骤是:创建一个CameraController脚本,挂在相机上。在脚本中获取角色的Transform,然后在LateUpdate中,将相机的位置和旋转设置为角色的位置加上偏移量,并通过插值让旋转平滑过渡。 比如,代码可能如下: public class CameraController : MonoBehaviour { public Transform target; public float smoothSpeed = 0.125f; public Vector3 offset; void LateUpdate() { Vector3 desiredPosition = target.position + target.rotation * offset; Vector3 smoothedPosition = Vector3.Lerp(transform.position, desiredPosition, smoothSpeed); transform.position = smoothedPosition; Quaternion desiredRotation = Quaternion.LookRotation(target.position - transform.position); transform.rotation = Quaternion.Slerp(transform.rotation, desiredRotation, smoothSpeed); } } 不过,可能需要调整offset的计算方式,确保在角色旋转时,相机保持正确的相对位置。或者,将offset设置为局部坐标,当角色旋转时,相机会自动调整位置,因为offset会随着角色的旋转而改变方向。 另外,如果希望相机始终朝向角色的前方,可能需要直接让相机的旋转与角色同步,但这样可能不够灵活。或者,使用LookAt方法,让相机始终看向角色的位置,同时保持一定的距离和高度。 例如: transform.position = target.position - target.forward * distance + Vector3.up * height; transform.LookAt(target.position); 这样,当角色旋转时,相机会保持在后方一定距离和高度的位置,并始终看向角色。但这样可能不会有平滑的过渡,所以需要结合插值。 总结一下,步骤可能是: 1. 将相机设置为独立物体,不一定是角色的子物体。 2. 使用脚本在LateUpdate中更新相机的位置和旋转,基于角色的Transform。 3. 使用插值使移动和旋转平滑。 4. 处理输入,如鼠标移动,控制相机的旋转(如果需要玩家手动控制视角)。 或者,如果相机需要跟随角色的头部或某个特定点,可能需要将目标设为角色的某个子物体,比如头部骨骼或空物体。 另外,要注意坐标系的问题,确保偏移量在正确的方向。例如,offset可能是(0, 2, -5)表示在角色后方5单位,上方2单位的位置。 可能还需要处理碰撞,避免相机穿墙,这可能需要使用射线检测,调整相机的位置,但用户的问题可能暂时不需要这个部分。 根据用户的请求,需要提供具体的教程步骤和代码示例,所以需要整理出一个清晰的步骤,并确保代码正确。</think>### Unity3D相机跟随人物视角转向的实现步骤 #### 方法一:基础父子关系绑定 1. **层级设置** 将相机拖拽到角色物体下成为子对象,相机会自动继承父物体的旋转和位移。适合简单跟随需求,但缺乏平滑过渡。 2. **调整偏移量** 在角色坐标系中设置相机的局部位置(如$z=-5, y=2$),保持角色旋转时相机同步转向。 #### 方法二:独立控制脚本(推荐) 1. **创建相机控制器脚本** 新建脚本`CameraFollow.cs`,定义目标对象和参数: ```csharp public class CameraFollow : MonoBehaviour { public Transform target; // 绑定角色Transform public float smoothSpeed = 0.1f; public Vector3 offset = new Vector3(0, 2, -5); // 相对偏移量 } ``` 2. **实现平滑跟随逻辑** 在`LateUpdate`中使用插值计算位置和旋转: ```csharp void LateUpdate() { // 计算目标位置(基于角色旋转调整偏移方向) Vector3 desiredPosition = target.position + target.rotation * offset; transform.position = Vector3.Lerp(transform.position, desiredPosition, smoothSpeed); // 保持相机始终看向角色 transform.LookAt(target.position); } ``` 3. **处理视角转向输入** 若需手动控制视角(如鼠标拖动): ```csharp public float rotationSpeed = 3.0f; void Update() { float mouseX = Input.GetAxis("Mouse X") * rotationSpeed; target.Rotate(0, mouseX, 0); // 角色水平旋转 } ``` #### 方法三:使用Cinemachine插件 1. **安装Cinemachine** 通过Package Manager安装Cinemachine插件。 2. **配置FreeLook Camera** - 创建`CinemachineFreeLook`相机,绑定角色为`Follow`和`Look At`目标。 - 在轨道设置中调整半径、高度和阻尼参数实现平滑转向[^1]。 --- ### 常见问题解决 1. **相机抖动** 确保在`LateUpdate`中更新相机位置,避免角色移动与相机更新顺序冲突[^5]。 2. **穿墙问题** 添加`Physics.Raycast`检测障碍物,动态缩短相机距离: ```csharp RaycastHit hit; if (Physics.Raycast(target.position, -transform.forward, out hit, offset.magnitude)) { transform.position = hit.point + transform.forward * 0.5f; } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值