[유니티 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에 내가 원하는 벡터를 새로 만들어 할당하는 방법이다.
'유니티, C#' 카테고리의 다른 글
| [유니티, C#] SerializeField와 Serializable 차이 (0) | 2023.04.17 |
|---|---|
| [유니티 3D] "Dev Weeks: 스마트한 카메라 시스템, 시네머신 파헤치기" 정리 (0) | 2022.06.03 |
| [C#] 인터페이스와 추상클래스 (0) | 2022.05.04 |
| [C#] Value type과 Reference type (0) | 2022.05.04 |
| [유니티 2D] 씬 전환, 텍스트 박스 Fade in / Fade out Coroutine으로 구현하기 (0) | 2022.03.02 |