当前位置: 首页 > 知识库问答 >
问题:

碰撞器。启用错误:真,然后错误循环

鲁鹤轩
2023-03-14

我试图使我的动画敌人(子对象)在enemieDeath==true时禁用其碰撞器。我写了一个调试。日志显示“Collider.Enabled=true,Collider.Enabled=false,在我的玩家与敌人的孩子(有动画)碰撞后,它会在一个无休止的循环中执行此操作。

这是我正在使用的脚本。

移动脚本

//引用PlayerController脚本

            if (playerControllerScript.enemieDeath == true)
        {
            goblinCollider.enabled = !goblinCollider.enabled;
            enemieAnimator.SetBool("IsDead", true);
            Debug.Log("Collider.enabled = " + goblinCollider.enabled);
        }
    }

玩家控制器脚本

        void FixedUpdate()
        {

         int layerMask = 1 << 8;
         int layerMaskCollectable = 1 << 9;
         RaycastHit hit;

         if (Physics.Raycast(transform.position, transform.TransformDirection(Vector3.down), out hit, 1.5f, layerMask))
        {
           Debug.DrawRay(transform.position, transform.TransformDirection(Vector3.down) * hit.distance, Color.yellow);
           Debug.Log("Did Hit");
           enemieDeath = true;
           //Destroy(hit.transform.gameObject); 
           playerRb.AddForce(Vector3.up * bounceForce, ForceMode.Impulse);
           gameManager.UpdateScore(20);
            
        }

共有1个答案

晁英彦
2023-03-14

您没有发布第一个代码块的确切执行位置,但从行为中,我只能猜测它位于更新固定更新(或任何其他重复调用的内容)中。

因此,只要设置<code>PlayerController脚本。enemieDeathtotrue每次切换启用值时都会反复执行。

一个快速的解决办法是宁愿检查和设置

if (playerControllerScript.enemieDeath && goblinCollider.enabled)
{
    goblinCollider.enabled = false;
    enemieAnimator.SetBool("IsDead", true);
    Debug.Log("Collider.enabled = " + goblinCollider.enabled);
}

作为更一般的修复:停止投票检查布尔标志!而是让你的代码事件驱动,并在事件实际发生时禁用碰撞体等。

有e. g.

public class PlayerController : MonoBehaviour
{
    public event Action OnEnemyDied;

    private void FixedUpdate ()
    {
        ...

        if (Physics.Raycast(transform.position, transform.TransformDirection(Vector3.down), out hit, 1.5f, layerMask))
        {
           ...

           OnEnemyDied?.Invoke();
        }
    }

    ...
}

通过这种方式,您可以简单地注册一个回调,该回调只有在调用该事件时才会执行,例如

c# prettyprint-override">public class EnemyMove : MonoBehaviour
{
    [SerializeField] private PlayerController playerControllerScript;

    private void Awake ()
    {
        playerControllerScript.OnEnemyDied += OnEnemyDied;
    }

    private void OnEnemyDied ()
    {
        if(golblinCollider.enabled)
        {
            goblinCollider.enabled = false;
            enemieAnimator.SetBool("IsDead", true);
            Debug.Log("Collider.enabled = " + goblinCollider.enabled);
        }
    }

    ...
}
 类似资料:
  • 我是IOS开发的新手,目前在didBeginContact方法中遇到一些sprite工具包冲突问题。 如果一个碰撞的物理物体被移走了,我如何摆脱或者停止didBeginContact的运行?例:一颗子弹与两个重叠的敌人相撞。因为子弹击中第一个敌人并被摧毁,所以在第二个敌人上运行的碰撞检查抛出异常,因为子弹不再存在。 我试过检查nil和NSNULL值,但运气不好。我收到的错误代码是“线程1:EXC_

  • 刚开始在pygame中的精灵碰撞。运行此代码时,会弹出一个属性错误,指出“组”对象没有属性 “rect”。我不知道为什么会发生此错误。建议?

  • 我在雪碧套装里做一个复古街机游戏。我是这个框架的新手,所以我每分钟都发现新的东西,但很难解决这个问题,我在过去的几个小时里一直试图解决这个问题。 首先是游戏的屏幕转储和用红色勾勒出的物理实体。 http://i.imgur.com/KcbMVn4.png?1 当你按下拳击手套按钮时,大家伙通过这种方法进行拳击 } 我的碰撞代理如下所示 我这里的问题是,让didBeginContact记录命中的唯一

  • 我有一个豆荚,里面有一些可怕的、有缺陷的软件。Kubernetes很棒的一个原因是,它会在软件崩溃时重新启动,这太棒了。 库伯内特斯是为好软件而设计的,而不是糟糕的软件,所以它在重启吊舱时会以指数级退避。这意味着我必须在崩溃之间等待五分钟才能重启吊舱。 有什么方法可以限制kubernetes的退避策略吗?我想把它改为在再次启动吊舱之前不要等待超过30秒。

  • 我目前正在制作一个平台游戏,我被阻止碰撞...你能帮帮我吗?我实际上添加了一些方块来测试碰撞,在Perso类下创建了一个玩家。我真的需要在那个入口之后制造碰撞,并且必须精心设计重力来让玩家跳跃。这是我的代码:导入pyplay从pygame.locals导入*pygame.init() pygame.quit()

  • 我想做的是,在运行compose up之后,在我的web本地主机中看到一个简单的html文件。但我在localhost的8080 8000 8009端口中看不到任何东西。 当我将yml更改为 上面写着 caner@vegan:~/ideaprojects/combabety$pwd/home/caner/ideaprojects/combabety$ls docker-compose.yml ht