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

Unity变量修改后自动恢复原值:Projectile无法正确反射

解决Unity中Projectile反射后方向自动重置的问题

我帮你排查下这个问题——核心原因是你修改的不是当前碰撞到的那个Projectile实例的Directionx属性。你在PlayerCollision里声明的public ProjectileBehaviour projectileBehaviour应该是手动在Inspector里赋值了场景中初始的某个Projectile,但当碰撞发生时,你实际碰到的可能是另一个Projectile实例(比如通过Instantiate生成的),或者误把预制体拖进了这个变量里。这就导致你在ReflectProjectile里修改的是无关对象的Directionx,而真正要反射的子弹的方向根本没被改变,所以日志里看到的-1是那个被错误引用的对象的值,当前子弹的Directionx还是保持1,自然会直接穿过玩家。

正确的解决方案:从碰撞体获取当前Projectile实例

修改PlayerCollision的代码,直接从碰撞到的对象上获取对应的ProjectileBehaviour组件,而不是依赖全局引用:

using UnityEngine;

public class PlayerCollision : MonoBehaviour {
    void Start() { }
    void Update() { }

    private void OnTriggerEnter2D(Collider2D collision) {
        if (collision.CompareTag("Projectile")) {
            // 从碰撞对象获取对应的ProjectileBehaviour组件
            ProjectileBehaviour hitProjectile = collision.GetComponent<ProjectileBehaviour>();
            if (hitProjectile != null) {
                ReflectProjectile(hitProjectile);
            }
        }
    }

    private void ReflectProjectile(ProjectileBehaviour projectile) {
        // 取反当前方向,实现真正的反射(而不是固定设为-1)
        projectile.Directionx = -projectile.Directionx;
        Debug.Log($"当前子弹反射后的方向: {projectile.Directionx}");
    }
}

额外的优化与检查点

  • 记得移除PlayerCollision Inspector面板中projectileBehaviour变量的赋值,现在我们不再需要这个全局引用了
  • 确保你的Projectile预制体(或场景中的子弹对象)确实挂载了ProjectileBehaviour组件
  • 检查ProjectileBehaviour中是否有其他逻辑(比如Awake/Start或其他未展示的代码)会重置_directionx的值(从你提供的代码看没有,但后续扩展时要注意)
  • 另外,你可以优化MoveProjectile的方向逻辑,让符号更直观:
    private void MoveProjectile() => 
        transform.position += transform.right * (Time.deltaTime * Velocity) * Directionx;
    
    这样Directionx=1时子弹向右移动,Directionx=-1时向左移动,避免原代码中-transform.right带来的符号混淆。

内容的提问来源于stack exchange,提问作者Moe.Mayati

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:00:40