如何让敌人不要同时射击(第2场比赛)?

时间:2015-04-01 22:25:38

标签: c# unity3d

enter image description here

我的问题是所有三个敌人同时射击。我想要先然后第二个,然后第三个开始拍摄。

这是我的代码:

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()方法在动画中被称为事件。

你们对此有什么建议吗?

2 个答案:

答案 0 :(得分:3)

嗯,一种方式(尽管可能不是最好的方法)是在Start()内添加延迟。你可以有类似的东西:

public float startDelay;
...
void Start()
{
    ...
    StartCoroutine(startDelay());
}

IEnumerator startDelay()
{
    yield return new WaitForSeconds(startDelay);
    StartCoroutine(onAttack());
}

您可以根据需要设置startDelay。因为它是一个公共变量,你可以在检查器中为相应的gameObject设置它(如果你在脚本中设置它,每个对象可能会有相同的延迟,没有区别)。

另一种方法可能是随机化attackDelay。使用Random.Range确定attackDelay,同时将其保持在合理范围内。

我想你可能也想重新考虑你的敌人是如何运作的。也许让他们在玩家越过触发器时进行射击,或者在玩家进入射程时投入一些让他们射击的逻辑。

答案 1 :(得分:0)

我只是在某个地方保存一个静态布尔属性。 我们把它命名为“Can Shoot”。 当一个敌人射击并在射击延迟后使其成真时,我会把它弄错。

public float shooting delay;    

bool _canShoot;
public static bool canShoot
{
    get { return _canShoot; }
    set { _canShoot = value; StartCoroutine(EnableShooting()); }
}

IEnumerator EnableShooting()
{
    yield return new WaitForSeconds(delay);
    _canShoot = true;
}

现在只需将您的拍摄方法修改为仅在“canShoot”属性为真时拍摄

void onShoot(){
if (projectile && canShoot){ 
    canShoot = false;
    ... 
}