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

玩家死亡时Camera未切换至deathCameraTarget的问题求助

相机切换目标失败的问题修复方案

问题根源分析

  1. CameraMotor的player变量未初始化:Fighter脚本未调用cameraMotor.SetPlayer(this),导致SwitchTodeathCameraTarget方法里的player != null条件不成立,无法执行切换逻辑。
  2. originalLookAt被错误覆盖:SwitchTodeathCameraTarget中将originalLookAt赋值为死亡目标,丢失了初始的玩家目标,同时干扰了切换逻辑。
  3. originalLookAt未初始化:CameraMotor未在启动时保存初始的lookAt目标,导致后续重置操作无法正确恢复到玩家视角。

修复步骤与修改后的代码

1. 修复Fighter脚本,初始化CameraMotor的player变量

在Fighter的Start方法中添加代码,将当前玩家实例传递给CameraMotor:

using System.Collections;
using UnityEngine;

public class Fighter : MonoBehaviour
{
    public int hitpoint = 10;
    public int maxHitpoint = 10;
    public float pushRecoverySpeed = 0.2f;

    protected float immuneTime = 1.0f;
    protected float lastImmune;

    protected Vector3 pushDirection;

    public bool IsDead { get; private set; }

    private CameraMotor cameraMotor;

    void Start()
    {
        cameraMotor = FindObjectOfType<CameraMotor>();
        // 新增:将当前玩家实例传递给CameraMotor
        if (cameraMotor != null)
        {
            cameraMotor.SetPlayer(this);
        }
    }

    protected virtual void ReceiveDamage(Damage dmg)
    {
        if (Time.time - lastImmune > immuneTime)
        {
            lastImmune = Time.time;
            hitpoint -= dmg.damageAmount;
            pushDirection = (transform.position - dmg.origin).normalized * dmg.pushForce;

            GameManager.instance.ShowText(dmg.damageAmount.ToString(), 35, Color.white, transform.position, Vector3.zero, 0.5f);

            if (hitpoint <= 0)
            {
                hitpoint = 0;
                Death();
            }
        }
    }

    public virtual void Death()
    {
        IsDead = true;

        if (cameraMotor != null)
        {
            GameObject deathCameraTargetObject = GameObject.Find("deathCameraTarget");

            if (deathCameraTargetObject != null)
            {
                Transform deathCameraTarget = deathCameraTargetObject.transform;
                cameraMotor.SwitchTodeathCameraTarget(deathCameraTarget);
            }
            else
            {
                Debug.LogError("deathCameraTarget GameObject not found in the scene.");
            }
        }

        StartCoroutine(DestroyAfterDelay(2.0f));
    }

    private IEnumerator DestroyAfterDelay(float delay)
    {
        yield return new WaitForSeconds(delay);

        if (cameraMotor != null)
        {
            cameraMotor.ResetToOriginalLookAt();
        }

        Destroy(gameObject);
    }
}

2. 修复CameraMotor脚本,修正切换与重置逻辑

  • 在Start方法中初始化originalLookAt为初始的玩家目标
  • 修改SwitchTodeathCameraTarget方法,不再覆盖originalLookAt,直接设置lookAt为死亡目标
using UnityEngine;

public class CameraMotor : MonoBehaviour
{
    public float boundX = 0.001f;
    public float boundY = 0.001f;

    [SerializeField]
    private Transform lookAt;
    [SerializeField]
    private Transform originalLookAt;

    private Fighter player;

    void Start()
    {
        // 初始化originalLookAt为初始的玩家目标
        originalLookAt = lookAt;
    }

    public void SetPlayer(Fighter newPlayer)
    {
        player = newPlayer;
    }

    private void LateUpdate()
    {
        Vector3 delta = Vector3.zero;

        if (lookAt != null)
        {
            float deltaX = lookAt.position.x - transform.position.x;
            if (Mathf.Abs(deltaX) > boundX)
            {
                delta.x = deltaX > 0 ? deltaX - boundX : deltaX + boundX;
            }

            float deltaY = lookAt.position.y - transform.position.y;
            if (Mathf.Abs(deltaY) > boundY)
            {
                delta.y = deltaY > 0 ? deltaY - boundY : deltaY + boundY;
            }

            transform.position += delta;
            transform.LookAt(lookAt);
        }
    }

    public void SwitchTodeathCameraTarget(Transform deathCameraTarget)
    {
        // 确保玩家已死亡且死亡目标不为空
        if (player != null && player.IsDead && deathCameraTarget != null)
        {
            lookAt = deathCameraTarget;
        }
    }

    public void ResetToOriginalLookAt()
    {
        // 重置回初始的玩家目标
        lookAt = originalLookAt;
    }
}

3. 额外检查项

  • 确保场景中存在名为deathCameraTarget的GameObject(注意大小写完全匹配,GameObject.Find区分大小写)
  • 确认CameraMotor组件的lookAt字段在Inspector面板中已绑定到玩家对象
  • 可在Death方法中添加Debug.Log("Player died"),验证玩家死亡逻辑是否触发

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 23:47:20