Rozpocząłem nową grę, która nie wymaga myszy, pozostawiając ruch do klawiatury. Próbowałem włączyć 8 kierunków; w górę, w lewo, w prawo, w górę w prawo i tak dalej. Jednak po naciśnięciu więcej niż jednego klawisza strzałki prędkość ruchu kumuluje się ( http://gfycat.com/CircularBewitchedBarebirdbat ). Jak mogę temu przeciwdziałać?
Oto odpowiednia część mojego kodu:
var speed : int = 5;
function Update () {
if (Input.GetKey(KeyCode.UpArrow)) {
transform.Translate(Vector3.forward * speed * Time.deltaTime);
} else if (Input.GetKey(KeyCode.UpArrow) && Input.GetKey(KeyCode.RightArrow)) {
transform.Translate(Vector3.forward * speed * Time.deltaTime);
} else if (Input.GetKey(KeyCode.UpArrow) && Input.GetKey(KeyCode.LeftArrow)) {
transform.rotation = Quaternion.AngleAxis(315, Vector3.up);
}
if (Input.GetKey(KeyCode.DownArrow)) {
transform.Translate(Vector3.forward * speed * Time.deltaTime);
}
}
unity
javascript
movement
eren_tetik
źródło
źródło
Odpowiedzi:
Oddziel kod wyboru kierunku od rzeczywistego kodu ruchu.
Direction
, sprawdzając, które klawisze są naciskane. Zapisz go jako wektor jednostkowy (znormalizowany).Direction
przezSpeed
i zDeltaTime
.źródło
Musisz wziąć sumę wskazówek, znormalizować to, a następnie pomnożyć przez prędkość.
Stycznie odpowiedziałem na to jako część mojej odpowiedzi na Zapobieganie ruchom diagonalnym
Konkretnie:
źródło
„Znormalizowany wektor kierunku” to sposób, w jaki zwykle wykonuje się to zadanie i jak często to robię, ale ostatnio po prostu zaciskam wynikowy wektor ruchu. Zwykle osiąga ten sam efekt końcowy, a kod jest o wiele prostszy:
Prostszy kod jest prawie zawsze lepszy: E
źródło
ClampMagnitude
, czy nie jest to ten sam kod, coNormalize * Constant
w dyskursie?moveSpeed
pomnożyłbym tylko po zaciśnięciu i ewentualnie scaliłbym to przez pomnożenie przezdeltaTime
.