Wpis z mikrobloga

#gamedev #unity3d i chyba też #programowanie

Uczę się tworzyć gry na Unity3D i trafiłem na mały problem.

Napisałem skrypt, który odpowiada za wystrzelenie pocisku wzdłuż danej osi i po zakończeniu pętli for zniszczenie obiektu (żeby nie naspamowało się go po wielu wystrzałach). Problem polega na tym, że gdy wciśnie się spacje przed zakończeniem wykonywanie metody, to zostaje ona zatrzymana w aktualnym miejscu i jest puszczana na nowo, czyli: leci pocisk i w trakcie lotu wciskamy spację, pocisk się zatrzymuje a stateczek wystrzeliwuje nowy pocisk. Czyli jeśli wciśniemy wiele razy spację to dostajemy to: http://imgur.com/GQlSCZE

Mam nadzieję, że może ktoś podpowiedzieć co zrobić, żeby funkcja nie była przerywana. Albo może inaczej podejść do tego problemu? Z góry dzięki za pomoc.

Zawartość skryptu:

using UnityEngine;
using System.Collections;

public class leciPocisk : MonoBehaviour {
public player playerScript;
public float bulletSpeed = 20f;

public IEnumerator flyBullet(){
Instantiate (gameObject);
transform.position = new Vector3 (0, 0, playerScript.transform.position.z);
for (int i1 = 0; i1<=40; i1++){
transform.position += transform.up * Time.deltaTime * bulletSpeed;
yield return null;
}
Destroy (gameObject);
}
// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {
if (Input.GetKeyDown ("space")) {
StartCoroutine("flyBullet");
}

}
}
  • 10
  • Odpowiedz
@sbuasha: lista jednokierunokwa, spacja dodaje pocisk do listy. Podczas działania programu iterujesz po liście i sprawdzasz czy pocisk trzeba usunąć a jeśli nie to przesuwasz go dalej na ekranie.
  • Odpowiedz
@Spisssek: tak zrobię
@Adenozynotrifosforan: jeszcze pytanie, jak zespawnić pocisk w skrypcie stateczku?

Próbowałem tak:
if (Input.GetKeyDown ("space")) {
GameObject go = Instantiate(Resources.Load("Cylinder")) as GameObject;
}

Ale nie działa ( ͡° ʖ̯ ͡°)
  • Odpowiedz
@Adenozynotrifosforan: jak odpowiednio do tego sie podejdzie to zaoszedzi, mozna przy jednym iterowaniu po liscie robic pare rzeczy. Sprawdzac czy kolizja, przesuwac,jesli kolizja to usuwac. lista dostepna w c# powinna sie nadac. Takie rozwiazanie powinno byc optymalne.
  • Odpowiedz
@Adenozynotrifosforan:

Zawsze możesz dodać sobie publiczną zmienną typu GameObject w skrypcie i przeciągnąć prefab w inspektorze, żeby ustawić jej wartość.


Super, działa. To mi się podoba () Dzięki!
  • Odpowiedz