0
我製作了一個移動角色並設置動畫的腳本。當玩家想要向右走時,動畫被設置爲具有面向右側的角色並走的角色。一切都很完美,直到你想一次向兩個方向移動,讓我們說起來,離開。角色通過這兩個力量的合成,但動畫卻變得瘋狂。我爲此做了quickfix,不允許在其他動畫播放時播放左邊,右邊。 我在想這樣的事情: 當你正確的時候,你正對着右邊。繼續,然後你按下按鈕,你將進入東北方,但你仍然是正確的。 所以你就要面對你想要先走的一面,在這個例子中是正確的。角色移動,換球員動畫
using UnityEngine;
using System.Collections;
public class player_movement : MonoBehaviour {
//przyciski do poruszania się
private KeyCode right_key = KeyCode.D;
private KeyCode left_key = KeyCode.A;
private KeyCode up_key = KeyCode.W;
private KeyCode down_key = KeyCode.S;
//poruszanie się gracza right == true => porusza się w prawo, left == true => porusza się w lewo; itp..
private bool right;
private bool left;
private bool up;
private bool down;
player_statistics player; //zmienna przechowująca klasę? odnośnik do klasy? (yy nie wiem jak to nazwać)
void Start()
{
//przypisanie klasy do zmiennej, funkcji, klasy, no właśnie
player = GameObject.FindWithTag("Player").GetComponent<player_statistics>();
}
void Update()
{
movement_xy(); //wowołanie fukncji odp za wykrycie wciśnięcia klawiszy odp za poruszanie się
movement_animation();
}
void FixedUpdate()
{
if (right || left || up || down) //wywołanie funkcji odp poruszanie się
{
movement_force();
}
}
void movement_xy()
{
//ustawienie zmiennej odpowiedzialnej za ruch w prawo
if (Input.GetKeyDown(right_key))
{
right = true;
}
if (Input.GetKeyUp(right_key))
{
right = false;
GetComponent<Animator>().Play("idle_right", 0);
}
//ustawienie zmiennej odpowiedzialnej za ruch w lewo
if (Input.GetKeyDown(left_key))
{
left = true;
}
if (Input.GetKeyUp(left_key))
{
left = false;
}
//ustawienie zmiennej odpowiedzialnej za ruch w górę
if (Input.GetKeyDown(up_key))
{
up = true;
}
if (Input.GetKeyUp(up_key))
{
up = false;
GetComponent<Animator>().Play("idle_up", 0);
}
//ustawienie zmiennej odpowiedzialnej za ruch w dół
if (Input.GetKeyDown(down_key))
{
down = true;
}
if (Input.GetKeyUp(down_key))
{
down = false;
GetComponent<Animator>().Play("idle_down", 0);
}
}
void movement_force()
{
// przykładanie do postaci danej sił fizycznej na osi X i Y
if (left && player.player_gameobject.GetComponent<Rigidbody2D>().velocity.x > -5)
{
player.player_rigidbody.AddForce(new Vector2(-player.movement_speed, 0), ForceMode2D.Impulse);
}
if (right && player.player_gameobject.GetComponent<Rigidbody2D>().velocity.x < 5)
{
player.player_rigidbody.AddForce(new Vector2(player.movement_speed, 0), ForceMode2D.Impulse);
}
if (up && player.player_gameobject.GetComponent<Rigidbody2D>().velocity.y < 5)
{
player.player_rigidbody.AddForce(new Vector2(0, player.movement_speed), ForceMode2D.Impulse);
}
if (down && player.player_gameobject.GetComponent<Rigidbody2D>().velocity.y > -5)
{
player.player_rigidbody.AddForce(new Vector2(0, -player.movement_speed), ForceMode2D.Impulse);
}
}
void movement_animation()
{
if(right && !up && !down) //quick fix, not like this helped but character animation isnt in crazy angry kid state
{
GetComponent<Animator>().Play("go_right", 0);
}
if (left && !up && !down)
{
GetComponent<Animator>().Play("go_left", 0);
}
if (up)
{
GetComponent<Animator>().Play("go_up", 0);
}
if (down)
{
GetComponent<Animator>().Play("go_down", 0);
}
}
}
您可以使用else if來簡化該操作,並在其之前的if語句中刪除隨後測試的值。 – Alox