You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

恐怖游戏开发技术问题:实现玩家触发后相机锁定聚焦幽灵

解决恐怖游戏中相机锁定幽灵并环绕的问题

嘿,这个相机锁定幽灵的需求我刚好做过类似的,给你捋捋怎么实现!你提到的transform.LookAt()只能实现单次朝向设置,但要做到相机持续锁定幽灵+允许玩家环绕幽灵调整视角+玩家可自由移动,需要在每帧更新相机的位置和旋转逻辑,结合玩家输入来实现。下面是具体的实现步骤和代码示例:

核心思路

  • 用布尔变量标记相机的锁定状态,触发第二个触发器时激活该状态
  • 锁定状态下,相机以幽灵为中心,根据玩家输入(比如鼠标移动)计算环绕角度,动态调整相机位置
  • 每帧强制相机看向幽灵,同时保留玩家自身的移动控制逻辑

具体实现步骤

1. 编写相机锁定控制脚本

创建一个专门处理幽灵锁定逻辑的脚本,挂载在主相机上:

using UnityEngine;

public class GhostLockedCamera : MonoBehaviour
{
    [Header("锁定目标与参数")]
    public Transform ghostTarget; // 拖拽场景中的幽灵对象到这里
    public Transform player; // 拖拽玩家对象到这里
    public Vector3 cameraOffset = new Vector3(0, 1.8f, 2.5f); // 相机相对幽灵的初始偏移(高度+距离)
    public float rotateSpeed = 2f; // 环绕旋转的速度

    private bool isCameraLocked = false;
    private Quaternion initialRotation;

    // 触发相机锁定的方法,由触发器调用
    public void ActivateGhostLock()
    {
        isCameraLocked = true;
        initialRotation = Quaternion.LookRotation(ghostTarget.position - transform.position);
        // 如果玩家原来有普通相机跟随脚本,这里临时禁用它
        // player.GetComponent<NormalCameraFollow>().enabled = false;
    }

    void Update()
    {
        if (!isCameraLocked || ghostTarget == null) return;

        // 获取鼠标输入控制环绕角度
        float mouseX = Input.GetAxis("Mouse X") * rotateSpeed;
        float mouseY = Input.GetAxis("Mouse Y") * rotateSpeed;

        // 计算旋转后的偏移量,围绕幽灵旋转
        Quaternion rotationOffset = Quaternion.Euler(-mouseY, mouseX, 0);
        Vector3 newCameraPosition = ghostTarget.position + initialRotation * rotationOffset * cameraOffset;

        // 更新相机位置并强制看向幽灵上半身(增强沉浸感)
        transform.position = newCameraPosition;
        transform.LookAt(ghostTarget.position + Vector3.up * 0.5f);

        // 玩家正常移动逻辑不受影响,保持你原来的移动代码即可
    }

    // 可选:添加解锁逻辑,比如玩家离开区域时调用
    public void DeactivateGhostLock()
    {
        isCameraLocked = false;
        // 恢复原来的相机跟随脚本
        // player.GetComponent<NormalCameraFollow>().enabled = true;
    }
}

2. 配置第二个触发器

在玩家转身会触发的区域(比如死胡同入口附近)添加BoxCollider并勾选Is Trigger,给触发器绑定以下脚本:

using UnityEngine;

public class GhostLockTrigger : MonoBehaviour
{
    public GhostLockedCamera lockedCamera;

    void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player")) // 确保只有玩家触发
        {
            lockedCamera.ActivateGhostLock();
            // 这里可以同步添加幽灵的动画、恐怖音效等效果
        }
    }

    // 可选:玩家离开后解锁相机
    // void OnTriggerExit(Collider other)
    // {
    //     if (other.CompareTag("Player"))
    //     {
    //         lockedCamera.DeactivateGhostLock();
    //     }
    // }
}

3. 关键细节说明

  • 为什么单独用transform.LookAt()不行?:它只是一次性让相机看向幽灵,但没有处理玩家的环绕输入,也不会在玩家移动/视角调整时持续更新状态,所以必须放在Update()中每帧执行。
  • 相机偏移调整:cameraOffset可以根据你的游戏视角风格修改,比如调大z轴值让相机离幽灵更远,或调整y轴让视角更高/更低。
  • 玩家移动兼容性:这个逻辑不会干扰玩家的移动代码,玩家可以正常行走,相机始终围绕幽灵旋转聚焦,完全符合你的需求。

额外优化建议

  • 锁定时添加镜头缓慢拉近的动画,强化恐怖氛围
  • 限制视角的上下旋转角度,避免玩家抬头/低头破坏沉浸感
  • 锁定状态下略微降低玩家移动速度,让玩家更专注于眼前的幽灵

内容的提问来源于stack exchange,提问作者user9727936

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:58:11