Unity 2D实现玩家旋转但跟随相机不旋转的方法
2D俯视角射击游戏:相机跟随玩家但不随玩家旋转的实现方案
你当前的问题是相机作为玩家子物体时,会继承玩家的旋转导致视角偏移,以下是两种可行的解决方法:
方法一:给相机添加旋转锁定脚本
直接给相机挂载一个脚本,强制保持其初始旋转角度,不受父物体旋转影响:
创建CameraLockRotation.cs脚本,代码如下:
using UnityEngine; public class CameraLockRotation : MonoBehaviour { private Quaternion _originalRotation; void Start() { // 记录相机初始旋转状态 _originalRotation = transform.rotation; } void LateUpdate() { // 每帧重置旋转为初始状态 transform.rotation = _originalRotation; } }
将该脚本拖到相机对象上即可,相机只会跟随玩家移动,旋转始终保持不变。
方法二:分离玩家移动与旋转层级(推荐)
这种方式更符合游戏对象的结构设计,把玩家的移动和旋转逻辑拆分到不同对象上,从根源避免相机继承旋转:
调整对象层级
- 创建空对象命名为
PlayerRoot,将玩家的Rigidbody2D组件和PlayerScript脚本移到这个空对象上 - 将原来的玩家视觉对象(包含SpriteRenderer的对象)设为
PlayerRoot的子物体,命名为PlayerVisual - 将相机设为
PlayerRoot的子物体(而非PlayerVisual的子物体)
- 创建空对象命名为
修改PlayerScript代码
修改旋转逻辑,让PlayerVisual负责朝向鼠标,而不是PlayerRoot:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerScript : MonoBehaviour { public float moveSpeed = 5f; Vector2 movement; Vector2 mousePos; public Rigidbody2D rb; public Camera cam; public Transform playerVisual; // 在Inspector中拖入PlayerVisual对象 void Update() { movement.x = Input.GetAxisRaw("Horizontal"); movement.y = Input.GetAxisRaw("Vertical"); mousePos = cam.ScreenToWorldPoint(Input.mousePosition); } void FixedUpdate() { // 控制PlayerRoot移动 rb.MovePosition(rb.position + movement * moveSpeed * Time.fixedDeltaTime); // 计算朝向角度,控制PlayerVisual旋转 Vector2 lookDir = mousePos - rb.position; float angle = Mathf.Atan2(lookDir.y, lookDir.x) * Mathf.Rad2Deg - 90f; playerVisual.rotation = Quaternion.Euler(0, 0, angle); } }
这种结构下,PlayerRoot只负责移动,PlayerVisual负责旋转朝向鼠标,相机跟随PlayerRoot移动但不会继承旋转,同时后续扩展动画、碰撞体等功能时会更灵活。
内容的提问来源于stack exchange,提问作者Eduardo Marinho
相关产品推荐
相关产品推荐

