首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Collider.Enabled错误: true,然后false循环

Collider.Enabled错误: true,然后false循环
EN

Stack Overflow用户
提问于 2021-07-20 00:51:47
回答 1查看 87关注 0票数 0

我正试图使我的动画敌人(子对象)一旦enemieDeath ==变为真,就禁用它的对撞机。我写了一个debug.log,上面写着“对撞机。Enabled = true,Collider。Enabled = false,在我的玩家与enemie子游戏(它有动画)碰撞后,它会在一个无尽的循环中完成这个任务。

这是我正在使用的脚本。

EnemieMove脚本

//References PlayerController脚本

代码语言:javascript
复制
            if (playerControllerScript.enemieDeath == true)
        {
            goblinCollider.enabled = !goblinCollider.enabled;
            enemieAnimator.SetBool("IsDead", true);
            Debug.Log("Collider.enabled = " + goblinCollider.enabled);
        }
    }

播放器控制器脚本

代码语言:javascript
复制
        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);
            
        }
EN

回答 1

Stack Overflow用户

发布于 2021-07-20 01:58:49

您没有发布执行第一个代码块的确切位置,但是从行为中我可以猜到它是在UpdateFixedUpdate (或其他重复调用的任何代码块)中。

因此,一旦您将playerControllerScript.enemieDeath设置为true,它将一次又一次地执行,每次切换已启用的值。

一个快速的解决方法是检查并设置

代码语言:javascript
复制
if (playerControllerScript.enemieDeath && goblinCollider.enabled)
{
    goblinCollider.enabled = false;
    enemieAnimator.SetBool("IsDead", true);
    Debug.Log("Collider.enabled = " + goblinCollider.enabled);
}

作为一个更普遍的解决办法:停止投票检查bool标志!相反,让您的代码事件驱动并禁用对撞机等一次,当事件实际发生时,

有.

代码语言:javascript
复制
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();
        }
    }

    ...
}

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

代码语言:javascript
复制
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);
        }
    }

    ...
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68448423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档