🧩 코딩/코드 메모

UNITY 기초 플레이어 움직임 ( 점프(더블점프),회피 ) 애니메이터

코스모스몰리 2022. 9. 12. 18:58
728x90

 

 

 

* 다크 모드를 키고 보시면 일부 텍스트가 잘 보이지 않습니다 ! *

 

 

 

 

   ▪에셋 출처 👨

캐릭터

( 남자캐릭터의 머리와 검을 없애주었다. ) ( 추후 검은 아이템으로 다시 줍게 할 예정)

본 코드는 상당수 부분을 골드메탈님의 강좌 코드를 보고 작성하였습니다.

 


 

 

◆ Player 움직임 스크립트

 

 

 

 

 

float hAxis;
float vAxis; 

public float Speed;
public float JumpPower;
public float DJumpPower;

변수 선언 해준다.

float 실수
int 정수
public 인스펙터에서 변경 가능 한 값

왠만한 연산은 int로 해야지 좀 더 빨라진다는걸 책에서 본 적 있다.

정확해지진 않더라도, 소숫점 계산하는게 굉장히 복잡해진다고..(대충요약)

 

bool JDown;
bool isJump;
bool isDodge;
bool wDown;
bool dDown; 
bool JJDown; //더블점프 버튼
bool isJJDown; //더블 점프를 하고 있는가?
bool 참인가 거짓인가? 조건문과 결합하면 코드의 흐름을 조절할 수 있는 강력한 도구 ⛏

 

Rigidbody rigid;
Vector3 moveVec;
Vector3 DodgeVec;
Animator anim;

 

Rigidbody GameObject가 물리 제어로 동작하게 한다.
Vector3  3D 공간 안에서 X,Y,Z ( 변수 선언하고 무조건 초기화 해야함 )

 

void Awake()
{
    rigid = GetComponent<Rigidbody>();
    anim = GetComponentInChildren<Animator>();
}
GetComponent 게임 오브젝트의 컴포넌트를 가져오는 함수.

 

 

void Update() 
{
    GetInput();
    move();
    Jump();
    Trun();
    Dodge();
}

호출 해주기.

 

 

void GetInput()
{
    hAxis = Input.GetAxisRaw("Horizontal");
    vAxis = Input.GetAxisRaw("Vertical");//
    wDown = Input.GetButton("Walk");//걷기
    JDown = Input.GetButtonDown("Jump");//점프
    JJDown = Input.GetButtonDown("Jump");//더블점프
    dDown = Input.GetButtonDown("Dodge");//회피
}

GetInput() : 키 입력

(표 내용 출처 ↗)

GetAxisRaw InputManager에 입력된 키를 누를때, 값을 반환
nagative button을 누르면 음수가, positive button을 누르면 양수가 반환
GetButton 키를 눌렀을때는 true를 반환, 그렇지 않다면 false를 반환.
GetButtonDown 키를 눌렀을 때, 딱 한번 true를 반환

 

🚗 Horizontal,Vertical  🚗

 

void move()
{   
    moveVec = new Vector3(hAxis,0,vAxis).normalized;
    if(isDodge)
        moveVec = DodgeVec;
    
    anim.SetBool("isRun",moveVec != Vector3.zero);
    anim.SetBool("isWalk",wDown);
}
normalized  방향값이 1로 보정된 백터(피타고라스)
!=(bool) 같지 않다. 아니다.
anim animator의 변수명, move는 Run상태이니,
애니메이션 Run을 Vector3.zero가 아닐때 실행되게 한다.

Transform이동은 물리 충돌을 무시할 가능성이 있다.

일단은 RigidBody에 Collision Detection을 Continuuous로 변경.

 

Freeze Rotation은 뒤에 점프 할때 이상하게 넘어지는걸 방지해주기때문에 미리 체크표시를 켜두자 !

 

 

void Trun()
{   
    transform.LookAt(transform.position+moveVec);
   if(moveVec != Vector3.zero)
   {
    Quaternion newRotation = Quaternion.LookRotation(moveVec);
    rigid.rotation = Quaternion.Slerp(rigid.rotation,newRotation,rorateSpeed*Time.deltaTime);
   }
}

우리가 나아가는 방향으로 바라보는 스크립트

Quaternion 오로직 회전만을 다루는. x,y,z축 직접 접근하여 변경 불가능 제공해주는 함수를 사용 해야함.
Lookat Look At을 이용하면 게임 오브젝트의 앞 방향이 Look At에서 지칭하는 오브젝트를 바라본다.
MoveRotation(Qiaternion) 목표 회전값으로 바로 회전 
Slerp 목표 회전 값싸지 회전 속도에 따라 천천히 회전시키는 함수
Time.deltatime pc성능과는 다르게 동일한 Fps를 보여줌.

 

 

void Jump()
{
    if(JDown &&!isJump &&!isDodge)
    {
        rigid.AddForce(Vector3.up*JumpPower,ForceMode.Impulse);
        anim.SetBool("isJump",true);
        anim.SetTrigger("doJump");
        isJump = true;
        
    }
    else if( JJDown  &&!isDodge &&!isJJDown )
    {
        rigid.AddForce(Vector3.up*DJumpPower,ForceMode.Impulse);
        anim.SetBool("isJJDown",true);
        anim.SetTrigger("doJump");
        isJJDown = true;
    }
}

점프와 더블점프 구현 🏃‍♀️

&& and 연산자, 양쪽 모두 true면 true
ForceMode 어떤식으로 힘을 전달할 것인가?
Impulse (누가 밀듯이)짧은 순간의 힘, 무게적용

1단 점프 (if)

더블 점프(else if)

더블 점프 코드는 내가 만든 코드라, 살짝 이상한데.

JJDown를 하나 더 만들어서 애니메이션 파라메터만 잘 연결 해줬다.

 

 

 

void Dodge()
{
    if(dDown&&moveVec != Vector3.zero && !isJump &&!isDodge )
    {
        DodgeVec = moveVec;
        Speed*=2;
        anim.SetTrigger("doDodge");
        isDodge = true;

        Invoke("DodgeOut",0.5f); //밸런스 딜레이
    }
}

void DodgeOut()
{
    Speed *= 0.5f;
    isDodge = false;
}

회피

Invoke 함수 실행 지연 시킬 수 있다.

 

void OnCollisionEnter(Collision collision) 
{
    if(collision.gameObject.tag == "Floor")
    {
        anim.SetBool("isJump",false);
        isJump = false;
        anim.SetBool("isJJDown",false);
        isJJDown = false;
    }
    
}

무한 점프 제한 조건

OnCollisionEnter Collision에 들어갔을때 실행

만약 Player가 닿아있는 Collision이 Floor다

그러면 isJump,isJJDonw을 false 시켜주기. ( 다시 true가 되려면 점프키를 눌러야 한다.!)

 


Player Inspector
Player Tag
Floor Tag

 


◆ Unity Tag 설정 방법 👆

 

floor옆에 화살표 버튼을 누르고 Add Tag 클릭

 

+모양을 눌러서

태그를 추가해주시면 됩니다.

 

중요한점은

Tag를 이용해 이런식으로 코드 작성을 해주게 되는데,

본인이 설정한 태그와 똑같이 설정해주셔야 합니다.

아니면 오류가 발생하기 때문에, 코드가 제대로 작동이 되지 않는다면 오탈자가 있는지 먼저 확인 해주세요.

 


◆ animator 애니메이터 설정 🍳

 

오른쪽 클릭후 Animator 생성후

Player에게 넣어주기.

 

네모난 모양은 Bool

동그란 모양은 Trigger.

스크립트에 작성한대로 + 버튼 눌러서 만들어줍니다.

 

 

파라메터.

 

에셋 폴더에 animation 폴더에서 마음에 들고 행동에 알맞는 애니메이션을 가지고 와서 드래그 해주면 됩니다.

보통 애니메이션 이름에 다 적혀있는데

Idle은 아무것도 하지 않는 보통의 상태일때 실행되는 애니메이션입니다.

 

Any State 모습입니다.

아직 설명 되지 않은.. Get,Attack 부분을 제외하고 봐주시면 되겠습니다.

 

 

Jump 부분입니다.

Any state 를 jump와 연결해주고 jump와 doubleJump를 연결 해줍니다.

Land는 착지 입니다.

any state -> jump inspector입니다.

Conditions에 + 버튼을 눌러서 trigger값을 넣어줍니다.

 

더블점프는 따로 만들어둔 isJJDown을 넣어줍니다.

bool값을 썼습니다.

지금 현재 (1단)점프를 하고 있는가? 를 위해서

(1단 점프후에 가능 한 조건식 )

 

 

 

이런식으로 애니메이션 파라메터를 연결 해 줍니다.

참! Has Exit Time 은 꺼주도록 해요

 

 

 

 

Exit으로 나갈땐 아무것도 안 넣어주시면 되겠습니다.

 

 

 


잘못된 점이나 궁금하신 점은 

댓글로 알려주세요 !

 

글 읽어주셔서 감사합니다.

728x90