Wpis z mikrobloga

Mirasy kochane maniaki #unity3d mam problem ze skryptem strzelania. Wrzucam skrypta

public Transform bullet;

private GameObject bulletrigid;

void Update()

{

if (Input.GetButton ("Fire2"))

{

if(canShoot)

{

Instantiate(bullet, transform.position, this.transform.rotation);

bulletrigid = GameObject.FindGameObjectWithTag("Bullet");

bulletrigid.rigidbody.AddForce(velocity1 * 500);

StartCoroutine(ShootWait());

}

}

}

IEnumerator ShootWait()

{

canShoot = false;

yield return new WaitForSeconds (0.1f);

canShoot = true;

}

}

To jest wycinek skryptu, velocity1 to aktualny obrót gracza.

No i sprawa jest taka że skrypt działa i strzela tylko 1 pocisk a następny już nie ma nadanej siły tylko spawnuje się w mojej pozycji i tam sobie tam siedzi do usranej śmierci. Ktoś pomoże?

#wexproductions #gamedev

  • 13
@Wextor: Bez sensu to robisz. Siłę nadawaj obiektowi który właśnie stworzysz, w taki sposób

Twój sposób jest bez sensu z tego powodu, że jak będziesz miał w scenie 1000 pocisków, to przy każdym nowym procesor będzie musiał przeszukać wszystkie obiekty żeby znaleźć ten z tagiem "Bullet". Raz mu nadaj siłę i koniec.

A najlepiej utwórz skrypt "BulletScript" i w metodzie "Start" nadaj mu prędkość za pomocą rigidbody.velocity (najlepiej transform.forward * prędkość
@Wextor: Aha i jeszcze jedno.

Coroutines
niepotrzebnie obciążają w tym przypadku procesor, zrób metodę która będzie ustawiać

canShoot
na true i wywołaj ją za pomocą

Invoke()
z odpowiednim opóźnieniem
@Wextor: A kiedy chcesz je usuwać?

Możesz sobię właśnie zrobić listę pocisków w tym pliku przy użyciu np. Generic List i przy jej pomocy usuwać pociski przy jakichś warunkach.

Lub dodać do pocisku skrypt który usunie go przy jakichś warunkach. To by było prostsze, po prostu w Update sprawdzasz jego pozycję, odległość od czegoś lub czas życia i ewentualnie go usuwasz.
@blamedrop: To destroy to wiem ale jak wstukam destroy(bullet) to nie wywali mi wszystkich pocisków?

Dobra, usuwa tak jak trzeba :D Dzięki wszystkim, jest tu lepsza pomoc niż na jakimkolwiek forum unity :D
@Wextor: Przede wszystkim zrób tak, żeby strzelec nie miał danych dotyczacych pocisku. On tworzy prefab i ma to w dupie co się dzieje z pociskiem, pocisk sam powinien wiedzieć jak ma lecieć, sam sprawdzać kolizje itp.

Ja zawszę w

Start()
daję mu prędkość (rigidbody.velocity) i wywołuję destroy z odpowiednim opóźnieniem, żeby nie leciał w nieskończoność