我有一个空对象,它包含下面的脚本。我所取得的成就是如果一个敌人进入这个触发盒,玩家就无法做任何事情(他们被击晕)。直到他们按下“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 ();
}
}
}
答案 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>().enabled
,stop.enabled
即可。 (我想,在某些时候它可能是GameObject stop
。)