OnTriggerExit持续时间超过正常值?

时间:2018-05-03 07:01:49

标签: unity3d

我有一个空对象,它包含下面的脚本。我所取得的成就是如果一个敌人进入这个触发盒,玩家就无法做任何事情(他们被击晕)。直到他们按下“W”表示敌人将是setActive() false。我的问题是,当我按下“W”时,即使敌人不再在场景中活动,角色也会长时间震惊。我希望分钟球员按下“W”,晕眩完全消失而且不会持久。我还注意到,如果我将“W”键混合,则需要一段时间才能确认OnTriggerExit然后被注意到。

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class NoCasting : MonoBehaviour 
{

    [SerializeField]
    private Image customImage;

    //public Animator anim;

    public Casting stop;
    public AudioSource source;
    public AudioSource negative;
    public AudioSource helps;
    public AudioSource positive;
    public ParticleSystem stun;


    // Use this for initialization
    void Start () 
    {
        //anim = GetComponent<Animator> ();
        source = GetComponent<AudioSource>();
    }

    // Update is called once per frame
    void Update () {

    }


    private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.tag == "Enemy")
        {
            customImage.enabled = true;

            Debug.Log ("is working trigger");
            stop.GetComponent<Casting> ().enabled = false;
            source.Play ();
            negative.Play ();
            stun.Play ();
            //anim.Play ("DaniAttack");
        }

    }

    private void OnTriggerExit(Collider other)
    {
        if (Input.GetKeyDown ("w"))
        {
            Debug.Log ("is ended trigger");
            stun.Stop ();
            negative.Stop ();
            stop.GetComponent<Casting> ().enabled = !stop.enabled;
            customImage.enabled = false;
            helps.Play ();
            positive.Play ();
        }
    }
}

2 个答案:

答案 0 :(得分:0)

您正在检查OnTriggerExit中的输入,该输入仅在敌人从触发区域离开时才起作用。 (即如果他仍然在游戏附近,"W"媒体甚至不会被选中)。

您可以尝试以下解决方案:

添加一个布尔成员,指示玩家被击晕(在if语句中的true中将其设置为OnTriggerEnter,并在OnTriggerExit上将其设置为false)

移动&#34; W&#34;按键检查块到Update()方法。

答案 1 :(得分:0)

由于你必须检测Update中的输入,我不明白为什么在这种情况下你仍然需要OnTriggerExit(因为你也希望它是即时的)。< / p>

做这样的事情:

private bool isStunned = false;     // Add this so code isn't run when not stunned

private void OnTriggerEnter(Collider other)
{
    if(isStunned == false && other.gameObject.tag == "Enemy")
    {
        Stun();
    }
}

private void Update()
{
    if(isStunned == true && Input.GetKeyDown("w"))
    {
        Unstun();
    }
}

public void Stun()
{
    isStunned = true;

    // Do the stuff for stunning
}

public void Unstun()
{
    // Do the stuff that is needed for unstunning

    isStunned = false;
}

另外,另请注意:由于stop成员的类型为Casting,因此您无需撰写stop.GetComponent<Casting>().enabledstop.enabled即可。 (我想,在某些时候它可能是GameObject stop。)