我的问题是所有三个敌人同时射击。我要先拍摄然后再拍摄,然后再拍摄第三个。
这是我的代码:
public float speed = 7f;
public float attackDelay = 3f;
public Projectile projectile;
private Animator animator;
public AudioClip attackSound;
void Start () {
animator = GetComponent<Animator> ();
if(attackDelay > 0){
StartCoroutine(onAttack());
}
}
void Update () {
animator.SetInteger("AnimState", 0);
}
IEnumerator onAttack(){
yield return new WaitForSeconds(attackDelay);
fire();
StartCoroutine(onAttack());
}
void fire(){
animator.SetInteger("AnimState", 1);
if(attackSound){
AudioSource.PlayClipAtPoint(attackSound, transform.position);
}
}
void onShoot(){
if (projectile){
Projectile clone = Instantiate(projectile, transform.position, Quaternion.identity)as Projectile;
if(transform.localEulerAngles.z == 0){
clone.rigidbody2D.velocity = new Vector2(0, transform.localScale.y) * speed * -1;
}
else if(Mathf.RoundToInt(transform.localEulerAngles.z) == 90){
clone.rigidbody2D.velocity = new Vector2 (transform.localScale.x, 0) * speed;
}
else if(Mathf.RoundToInt(transform.localEulerAngles.z) == 180){
clone.rigidbody2D.velocity = new Vector2 (0, transform.localScale.y) * speed;
}
else if(Mathf.RoundToInt(transform.localEulerAngles.z) == 270){
clone.rigidbody2D.velocity = new Vector2(transform.localScale.x, 0) * speed * -1;
}
}
}
onShoot()方法在动画中被称为事件。
你们对此有什么建议吗?
最佳答案
嗯,一种方法(虽然可能不是最好的)是在Start()
内添加延迟。您可以有类似以下内容:
public float startDelay;
...
void Start()
{
...
StartCoroutine(startDelay());
}
IEnumerator startDelay()
{
yield return new WaitForSeconds(startDelay);
StartCoroutine(onAttack());
}
这样,您可以根据需要设置
startDelay
。因为它是一个公共变量,所以您可以在检查器中为相应的gameObject进行设置(如果在脚本中进行设置,则每个对象可能会有相同的延迟,没有任何区别)。另一种方法可能是随机化
attackDelay
。使用Random.Range
确定attackDelay
,同时将其保持在合理范围内。我认为您可能还需要重新考虑敌人的功能。也许让它们在玩家越过扳机时射击,或者采用某种逻辑使它们在玩家进入射程内时射击。