Autor Wątek: Jak uprościć kod? (JavaScript)  (Przeczytany 1352 razy)

Offline sgorkas

  • Użytkownik

# Listopad 02, 2013, 22:58:16
Witajcie! Jestem nowy na forum więc wybaczcie ewentualne wpadki. Otóż ostatnio tworzę skrypt dzięki któremu postać w mojej grze strzela w dwóch wymiarach(grę robię w Unity 3D). Kod działa lecz jest problem z jego rozbudowaniem bowiem jest gigantyczny. I jeszcze jedno pytanie: co zrobić by siła dodana w kodzie była dodana raz (a nie tak jak obecnie jest dodawana w kółko. Oto skrypt:

skrypt chodzenia i spawnu pocisków:
var player_speed : float = 10;
var bullet_spawn : Transform;
var shield_numbers : int = 2;
var shield : Transform;
//zmienne strzałów
var bullet_up : Transform;
var bullet_down : Transform;
var bullet_left : Transform;
var bullet_right : Transform;
var bullet_spawn_up : Transform;
var bullet_spawn_down : Transform;
var bullet_spawn_left : Transform;
var bullet_spawn_right : Transform;


function Update ()
{

//fragment odpowiedzialny za poruszanie się

if(Input.GetKey("d"))
{
transform.Translate(player_speed * Time.deltaTime,0,0);
}

if(Input.GetKey("a"))
{
transform.Translate(-player_speed * Time.deltaTime,0,0);
}

if(Input.GetKey("s"))
{
transform.Translate(0,0,-player_speed * Time.deltaTime);
}

if(Input.GetKey("w"))
{
transform.Translate(0,0,player_speed * Time.deltaTime);
}

//fragment odpowiedzialny za tarcze

if(Input.GetKeyDown("e") && shield_numbers < 0)
{
Instantiate(shield,transform.position,transform.rotation);
shield_numbers --;
}

//fragment odpowiedzialny za pociski

if(Input.GetKeyDown("up"))
{
Instantiate(bullet_up,bullet_spawn_up.position,bullet_spawn_up.rotation);
}
if(Input.GetKeyDown("down"))
{
Instantiate(bullet_down,bullet_spawn_down.position,bullet_spawn_down.rotation);
}
if(Input.GetKeyDown("left"))
{
Instantiate(bullet_left,bullet_spawn_left.position,bullet_spawn_left.rotation);
}
if(Input.GetKeyDown("right"))
{
Instantiate(bullet_right,bullet_spawn_right.position,bullet_spawn_right.rotation);
}



}
skrypt pocisku lecącego w górę
var bulletspeed :float = 10;
var bullettime :float = 5;

function Update ()
{
rigidbody.AddRelativeForce(0,0,bulletspeed);
Destroy(gameObject,bullettime);
}
skrypt pocisku lecącego w dół
var bulletspeed :float = 10;
var bullettime :float = 5;

function Update ()
{
rigidbody.AddRelativeForce(0,0,-bulletspeed);
Destroy(gameObject,bullettime);
}
pocisk w lewo i prawo działają na tej samej zasadzie. Jeśli chodzi o pociski są to kule i chciałbym aby po dodaniu siły toczyły się w określoną stronę a jednocześnie możliwe było ich odbicie(np.siłą wybuchu).
Z góry dzięki za pomoc =>


Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline koirat

  • Użytkownik

# Listopad 03, 2013, 00:15:54
Jesli chcesz ustawic predkosc poczatkowa dla pocisku to mozesz skozystac z przeciazonej metody addforce ktorej mozna dodatkowo ustawic ForceMode

Offline Ivian

  • Użytkownik
    • Ivian's Cave

# Listopad 04, 2013, 10:50:25
ProTip: Pociski nie potrzebują Update().

ProTip2: Zainwestuj w klasę InputManager która będzie odpowiedzialna za triggerowanie odpowiednich funkcji/eventów w klasie docelowej (np. player) Bonusy są takie, że ograniczasz się do jednego Update() dla kilku klas korzystających z inputu [ProTip3: Im mniej Update() tym lepiej] ponadto łatwo w ten sposób a) rozbudować input na dotyk/pad/sterowanie głosem bo funkcje, które wywołujesz w innych klasach są te same.

Dobra dość tych pro tipów.

Jak przsuwasz obiekt który ma collider (a nie daj Boże rigidbody) za pomocą Transform.Translate() to nie rób tego w Update() a w FixedUpdate()

Po co tyle bulletów? (latanie we wszystkie kierunki) Nie lepiej żeby była jedna klasa do tego?