캐릭터 움직임에 원근감을 넣어보자!
이번에는 캐릭터의 움직임에 원근감을 넣어볼것이다.
내가 전문적인 개발자가 아니라서 이 코드가 정확한지 효과적인지 모르겠지만 그래도 내가 만들어낸 아이디어를
코드로 작성해냈다는 것이 의미가 있다.
영상으로 먼저 확인 해보자.
일단 이렇게 만들 수 있던 큰 이유는 바로 Scale 덕분이다.
사실 어떻게 생각해보면 그림에서의 원근법은 투시도에 따라서 달라지지만 지금 내게 그런 고급기술을 사용할만한
능력은 없다.
어찌 됐던 꼼수를 사용해서 그럴싸하게 보이는 걸로 만족했다.
더 고차원의 기술은 나중에 튜터님께서 알려주시겠지.
내가 사용한 코드는 이것이다.
public Vector2 inputVec;
Rigidbody2D rigid;
public float speed;
// Start is called before the first frame update
void Start()
{
rigid = GetComponent<Rigidbody2D>();
}
// Update is called once per frame
void Update()
{
inputVec.x = Input.GetAxis("Horizontal");
inputVec.y = Input.GetAxis("Vertical");
}
private void FixedUpdate()
{
Debug.Log(Mathf.Abs(transform.position.y));
float scale = 180 / Mathf.Abs(transform.position.y);
transform.localScale = new Vector3(scale, scale, 1);
Vector2 nextVec = inputVec.normalized * speed * Time.fixedDeltaTime;
rigid.MovePosition(rigid.position + inputVec);
}
이코드는 여러 유튜버를 보고 참고해서 만들었다.
inputVec.x = Input.GetAxis("Horizontal");
이코드는 가로축의 플레이어의 입력을 검색한다. 좌우움직임을 감지하는 것이다. -1이라면 왼쪽 1이라면 오른쪽이다.
0이라면 좌우 움직임이 없는것.
inputVec.y = Input.GetAxis("Vertical");
이코드는 세로축의 플레이어의 입력을 검색한다. 상하움직임을 감지하는 것이다. -1이라면 아래 1이라면 위쪽이다.
0이라면 상하 움직임이 없는것.
두가지 모두 0이라면 아예 움직임이 없는것이다.
Vector2 nextVec = inputVec.normalized * speed * Time.fixedDeltaTime;
이 코드 중 normalized 는 어느 방향이던지 1의 크기로 움직이게 해주는 속성인데 그게 무슨 상관이야 하겠지만
대각선이동을 생각해보면 쉽게 이해할 것이다. 세로와 가로가 1인 사각형의 대각선은 1이 아니다.
플레이어가 이동할 때도 대각선만 더 길게 움직이게 된다면 컨트롤 하기가 힘들것이다. 그것을 방지하는 것이 normalized라는 속성이다.
float scale = 180 / Mathf.Abs(transform.position.y);
transform.localScale = new Vector3(scale, scale, 1);
이 코드는 웃긴게.. 조금 이상한 코드다 절대 따라서 쓰지말자 그냥 아이디어라고 생각하면 좋겠다.
작동은 하겠지만 ㅋㅋㅋ 이상할것이다. 향후 좀더 보안해보겠다.
플레이어의 이미지 스케일을 y포지션 값에 따라 변화를 시킨것이다.
왜 180이냐고 묻는다면.. 디버그로그로 찍어보니 대충 저렇게 하면 최적의 값이 나와서 저렇게 했다.
이 스크립트를 플레이어에게 넣고 움직이면 신기하게도 저 영상처럼 작동한다.
물론 Rigidbody2D는 넣어주어야 한다.