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}"); } }
额外的优化与检查点
- 记得移除
PlayerCollisionInspector面板中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
相关产品推荐
相关产品推荐

