[유니티 2D] 좌우이동 반복(Time, deltatime, /좌우반전 (localscale)

2022. 1. 12. 19:16유니티, C#

  

유니티를 처음 공부하면서 적는 글입니다.
가르침은 언제나 환영입니다!


 

새로 진행하는 프로젝트에 게임 npc가 좌우로 반복 이동하는 로직을 구현해야했다.

 


 

[ 조건 ]

1. 오브젝트의 초기 위치(x)는 -20.0f이고 20.0f까지 좌우 반복한다.

2. 오른쪽으로 이동할 때와 왼쪽으로 이동할 때 스케일이 좌우반전 되어야 한다. 

 


[ 소스코드 ]

public class Project_1 : MonoBehaviour
{
    private float rightMax = 20.0f;	//좌로 이동가능한 최대값.
    private float leftMax = -20.0f;	//우로 이동가능한 최대값.

    private float currentPosition;	//현재 위치(x)를 저장할 변수.
    private float currentScale;		//현재 스케일(x)를 저장할 변수.

    private float direction = 1.0f	//방향.
    private float velocity = 2.0f;	//속도.

    void Start()
    {
        currentPosition = transform.position.x; //현재 위치의 x값 저장.
        currentScaleX = transform.localScale.x;	//현재 스케일의 x값 저장.
        currentScaleY = transform.localScale.y; //현재 스케일의 y값 저장.
    }

    void Update()
    {
        Move();
    }

    void Move()
    {
        currentPosition += Time.deltaTime * direction * velocity;

        if (currentPosition >= rightMax)		//현재 위치가 rightMax보다 크거나 같다면
        {
            currentPosition = rightMax;			//현재 위치는 rightMax로 설정하고
            LeftTurn();					//LeftTurn을 실행한다.
        }

        else if (currentPosition <= leftMax)		//현재 위치가 leftMax보다 크거나 같다면
        {
            currentPosition = leftMax;			//현재 위치는 leftMax로 설정하고
            RightTurn();				//RightTurn을 실행한다.
        }

        transform.position = new Vector2(currentPosition, 1);
    }

    private void LeftTurn()
    {
        direction = -1f;				//방향을 왼쪽으로 설정
        //currentScaleX에 -1을 곱한 값과 currentScaleY로 새로운 벡터를 생성해 localScale에 할당..
        transform.localScale = new Vector2(currentScaleX * -1, currentScaleY);
    }

    private void RightTurn()
    {
        direction = 1f;					//방향을 오른쪽으로 설정(원래 방향과 동일).
        transform.localScale = new Vector2(currentScaleX, currentScaleY);
    }


}

간단한 로직이라 설명이 더 필요하지는 않을 것 같다.

 


 

구현에서 애먹은 것이 하나 있었는데 왼쪽으로 이동시에 Scale x값이 뒤집어져야했다.

 

처음짠 코드는 아래와 같다.

transform.localScale.x *= -1;

 

transform.localScale.x는 벡터가 아니라 상수값이니 -1을 곱해서 그대로 넣어주면 될 줄 알았다.

CS1612 : 구조체를 직접 수정하려고 할때 발생하는 오류라고 한다.

 

찾은 방법은 두가지 인데,

//첫 번째 방법
Vector2 vc = transform.localScale;
vc.x = currentScale * -1;
transform.localScale = vc;

첫 번째는 마이크로소프트 공식 문서에 나온 방법인데, 먼저 로컬 변수에 할당하고 변수를 수정한 다음 컬렉션의 항목에 변수를 다시 할당하는 것이다.

 

//두 번째 방법
transform.localScale = new Vector2(currentScale * -1, currentScale);

두 번째는 localScale에 내가 원하는 벡터를 새로 만들어 할당하는 방법이다.