본문 바로가기

유니티/모바일 멀티플레이 Shooting Game

유니티 3D플레이어 움직임(부드럽게)

반응형

항상 Running게임을 만들었어가지고 딱히 움직임을 구현하는데 크게 어려움은 없었다.

왜냐하면 앞으로 나아가기만 하면되고 좌우로 움직임과 점프만 구현하면 되었기 때문이다.

하지만 이번에 Udemy에서 듣는 강의는 직접 플레이어를 움직이는 게임이다 보니 부드러운 플레이어의 움직임이 매우 중요하다. 그래서 이번에 배운 플레이어 코드를 내가 직접 단 주석과 함께 포스팅한다. 참고로 플레이어 에셋은 무료 에셋이며 아래 링크에서 다운 받았다.

https://assetstore.unity.com/packages/3d/characters/humanoids/sci-fi/sci-fi-soldier-29559

 

Sci-Fi Soldier | 캐릭터 | Unity Asset Store

Get the Sci-Fi Soldier package from Jellymobile and speed up your game development process. Find this & other 캐릭터 options on the Unity Asset Store.

assetstore.unity.com

 

MyPlayer.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MyPlayer : MonoBehaviour
{
    [SerializeField]//인스펙터에서만 참조 가능하게
    private float smoothRotationTime;//target 각도로 회전하는데 걸리는 시간
    [SerializeField]
    private float smoothMoveTime;//target 속도로 바뀌는데 걸리는 시간
    [SerializeField]
    private float moveSpeed;//움직이는 속도
    private float rotationVelocity;//The current velocity, this value is modified by the function every time you call it.
    private float speedVelocity;//The current velocity, this value is modified by the function every time you call it.
    private float currentSpeed;
    private float targetSpeed;


    void Update()
    {
        Vector2 input=new Vector2(Input.GetAxisRaw("Horizontal"),Input.GetAxisRaw("Vertical"));
        //GetAxisRaw("Horizontal") :오른쪽 방향키누르면 1을 반환, 아무것도 안누르면 0, 왼쪽방향키는 -1 반환
        //GetAxis("Horizontal"):-1과 1 사이의 실수값을 반환
        //Vertical은 위쪽방향키 누를시 1,아무것도 안누르면 0, 아래쪽방향키는 -1 반환

        Vector2 inputDir=input.normalized;
        //벡터 정규화. 만약 input=new Vector2(1,1) 이면 오른쪽위 대각선으로 움직인다.
        //방향을 찾아준다

        if(inputDir!=Vector2.zero)//움직임을 멈췄을 때 다시 처음 각도로 돌아가는걸 막기위함
        {
            float rotation=Mathf.Atan2(inputDir.x,inputDir.y)*Mathf.Rad2Deg;
            transform.eulerAngles=Vector3.up*Mathf.SmoothDampAngle(transform.eulerAngles.y,rotation,ref rotationVelocity,smoothRotationTime);
        }
        //각도를 구해주는 코드, 플레이어가 오른쪽 위 대각선으로 움직일시 그 방향을 바라보게 해준다
        //Mathf.Atan2는 라디안을 return하기에 다시 각도로 바꿔주는 Mathf.Rad2Deg를 곱해준다
        //Vector.up은 y axis를 의미한다
        //SmoothDampAngle을 이용해서 부드럽게 플레이어의 각도를 바꿔준다.

        targetSpeed=moveSpeed*inputDir.magnitude;
        currentSpeed=Mathf.SmoothDamp(currentSpeed,targetSpeed,ref speedVelocity,smoothMoveTime);
        //현재스피드에서 타겟스피드까지 smoothMoveTime 동안 변한다
        transform.Translate(transform.forward*currentSpeed*Time.deltaTime,Space.World);
    }
}

이번에 배운것중 가장 인상깊은건 Mathf.SmoothDamp이다. 이 함수 없이 코드를 짜면 플레이어가 뭔가 너무 딱딱딱 움직인다고 해야하나. 오른쪽 방향키 누르면 바로 오른쪽보고, 왼쪽 방향키 누르면 바로 왼쪽보고. 이동할때도 속도가 0에서 갑자기 10으로 바뀌어서 부자연스럽게 움직여진다. 그걸 방지해주고 부드럽게 해주는게 Mathf.SmoothDamp이다

아직은 애니메이션과 카메라를 손 보진 않아서 어색해보인다. 하지만 이동,회전은 만족스럽게 충분히 부드럽게 나온다.

 

결과 영상

p.s 원래는 스크립트 이름을 Player라고 할라했으나 받은 import한 PUN 에셋에 이미 Player.cs라는 스크립트가 있어서 MyPlayer라고 이름을 지었다. 

+사실 그리고 Mathf.SmoothDamp의 ref speedVelocity같은건 무슨역할인지 아직 잘 모르겠다. 걍 쓰래서 쓰는중

반응형