2014-10-26 24 views
8

Tôi đã có một câu hỏi nhanh về 2D Sprite hình ảnh động mà tôi đã không thể tìm thấy đặc biệt trả lời bất cứ nơi nào:Flipping 2D Sprite Animation trong Unity 2D

Tôi có một sprite với hình ảnh động đi bộ sang bên phải. Tuy nhiên, tôi rõ ràng muốn lật hoạt hình sang trái khi anh ấy đi bên trái (2D side-scroller).

Tôi có thể dễ dàng lật chính sprite, bằng cách sử dụng transform.localscale.x, tuy nhiên, chỉ lật các sprite. Không phải là đoạn phim hoạt hình.

Vì vậy, trong khi sprite flips, phút clip hoạt hình bắt đầu phát, nó quay trở lại bên phải (như clip hoạt hình duy nhất tôi có là dành cho sprite phải đối mặt).

Cách duy nhất để làm điều này để lật các hình ảnh trong Photoshop, hoặc có cách nào để thực hiện nó trong Unity?

Cảm ơn!

Trả lời

10

Cuối cùng tôi figured it out bằng cách làm này:

void Flip() 
{ 
    // Switch the way the player is labelled as facing 
    facingRight = !facingRight; 

    // Multiply the player's x local scale by -1 
    Vector3 theScale = transform.localScale; 
    theScale.x *= -1; 
    transform.localScale = theScale; 
} 

Đây là từ ví dụ 2D platformer Unity của.

Để thực hiện một số loại kiểm tra sử dụng phương pháp Flip, bạn có thể làm điều gì đó tương tự như ví dụ bên dưới là mã chuyển động cơ bản. facingRight được đặt làm giá trị trên lớp để các phương pháp khác có thể sử dụng nó và được mặc định là false.

void Update() 
{ 

    //On X axis: -1f is left, 1f is right 

    //Player Movement. Check for horizontal movement 
    if (Input.GetAxisRaw ("Horizontal") > 0.5f || Input.GetAxisRaw("Horizontal") < -0.5f) 
    { 
     transform.Translate (new Vector3 (Input.GetAxisRaw ("Horizontal") * moveSpeed * Time.deltaTime, 0f, 0f)); 
     if (Input.GetAxisRaw ("Horizontal") > 0.5f && !facingRight) 
     { 
      //If we're moving right but not facing right, flip the sprite and set  facingRight to true. 
      Flip(); 
      facingRight = true; 
     } else if (Input.GetAxisRaw("Horizontal") < 0.5f && facingRight) 
     { 
      //If we're moving left but not facing left, flip the sprite and set facingRight to false. 
      Flip(); 
      facingRight = false; 
     } 

    //If we're not moving horizontally, check for vertical movement. The "else if" stops diagonal movement. Change to "if" to allow diagonal movement. 
    } else if (Input.GetAxisRaw ("Vertical") > 0.5f || Input.GetAxisRaw("Vertical") < -0.5f) 
    { 
     transform.Translate (new Vector3 (0f, Input.GetAxisRaw ("Vertical") * moveSpeed * Time.deltaTime, 0f)); 
    } 

    //Variables for the animator to use as params 
    anim.SetFloat ("MoveX", Input.GetAxisRaw ("Horizontal")); 
    anim.SetFloat ("MoveY", Input.GetAxisRaw ("Vertical")); 

} 
+0

Tôi đã chỉnh sửa trong phần bổ sung muộn cho câu trả lời rất hữu ích này mà tôi đã thực hiện, đó là thực hiện kiểm tra khi nhấn phím để xác định xem nếu sprite cần được lật hay không. – Donglecow

+0

@Donglecow - thay đổi quá lớn, có thể bạn nên tạo một câu trả lời khác. – dbc

+0

@dbc phải không? Tôi đã thực sự chỉ xây dựng trên câu trả lời của Jestus bằng cách cung cấp một chút mã cơ bản để cho thấy phương pháp có thể được thực hiện như thế nào. Nếu bạn vẫn nói như vậy, thì tôi sẽ hoàn nguyên bản chỉnh sửa và đăng câu trả lời của riêng tôi. – Donglecow

1
void FlipHorizontal() 
{ 
    animator.transform.Rotate(0, 180, 0); 
} 

Bạn cũng có thể làm điều đó trên chuyển đổi bản thân (không có phim hoạt hình). Nhưng trong trường hợp đó giá trị luân phiên có thể được overriden bởi animator

0

Đây là cách tôi đã làm nó - gần giống như kỹ thuật khác của Jestus với tập lệnh thống nhất.

var facing : String = "right"; 

function updateFacing(curr : String){ 
    if(curr != facing){ 
     facing = curr; 
     var theScale : Vector3 = gameObject.transform.localScale; 
     theScale.x *= -1; 
     gameObject.transform.localScale = theScale; 
    } 
} 

//put to use 
function controls(){ 
    if(Input.GetKey (KeyCode.LeftArrow)){ 
     updateFacing("left"); 
    } else if(Input.GetKey (KeyCode.RightArrow)){ 
     updateFacing("right"); 
    }  
} 
0

Nếu bạn đang tạo hiệu ứng động trong Unity:

  1. Sao chép tất cả các khung (sprites) của hình ảnh động mà bạn muốn lật qua.
  2. Dán các khung đó vào hoạt ảnh mới của bạn và chọn mọi thứ trên khung hình đầu tiên.
  3. Thay đổi tỷ lệ x của khung hình đầu tiên từ 1 thành -1.
  4. Làm tương tự với khung hình cuối cùng của hoạt ảnh.

Bây giờ, nó sẽ phát theo hướng ngược lại!

+0

Được phép của [EduLopez's] (https: // stackoverflow.com/users/3297761/edulopez) đề nghị chỉnh sửa (mà lẽ ra đã được đăng là bình luận hoặc alt ans): "_Bạn cũng có thể có một hoạt hình đi bộ bên trái và có một chức năng chỉ để đối mặt với sprite của bạn. Tùy thuộc nếu' isFscingRight == true', tỷ lệ x sẽ là 1 hoặc -1) _ " – gms0ulman

+0

Đó cũng là một câu trả lời hay. Một cách khác để làm điều này trong chế độ xem gui hoạt hình. Không nên là một câu trả lời tiêu cực .... – Lovera