본문 바로가기
1인개발/유니티

유니티 움직이는 발판 위에서 같이 움직이기

by MaskOfDali 2020. 7. 18.
반응형

움직이는 발판을 만들었을 때, 게임 캐릭터가 발판을 밟는 순간 굉장히 어색한 장면을 보게 되는 경우가 있습니다. 발판 위에서 마이웨이 주장하는 캐릭터...

 

아이 숭해

 

이 글은 비전공 + 무경험 + 독학자로서 공부 및 기록을 겸하며 작성되고 있으므로, 전문적인 내용이 아님을 알려드립니다.

 

 

  1. 첫번째 시도
    • 인터넷 서칭을 해보니 발판 오브젝트에 마찰력을 부여하라는 글이 있어서 따라 해 봤는데 실패했습니다. 2D라서 그런건지 잘은 모르겠습니다. 
  2. 두번째 시도
    • 발판에 리지드바디를 추가해 속력을 구한 다음 캐릭터에 동일한 속력을 대입해주려고 했는데, 또 뭘 잘못 한건지 캐릭터가 발판 위에서 소심하게 주춤주춤해 합니다. 머..머여... 내 마음인가...
  3. 세번째 시도
    • 캐릭터가 발판을 밟는 순간의 캐릭터 위치, 발판 중앙의 위치, 그 두 위치의 거리를 각각의 변수에 저장 하고, 캐릭터에 이동 입력이 없는 한 그 거리를 유지하게 함
    • 이것은 성공했습니다. 

 

public class PlayerController : MonoBehaviour {   
    
    private bool isGrounded = false;
    private GameObject contactPlatform;
    private Vector3 platformPosition;
    private Vector3 distance;
    
    void Update() {     
        //움직이는 발판에서 같이 움직이기
        if (contactPlatform != null) {
        	//바닥을 밟고 있고, 좌우로 움직이고 있지 않은 경우
            if (isGrounded && playerInput.inputRight + playerInput.inputLeft == 0) {                
            	//캐릭터의 위치는 밟고 있는 플랫폼과 distance 만큼 떨어진 위치
                transform.position = contactPlatform.transform.position - distance;
            }
        }
    }

	private void OnCollisionEnter2D(Collision2D collision) {   
    	//플랫폼이 45도 이내의 기울기일 때에만 바닥으로 판정
    	if (collision.contacts[0].normal.y > 0.7f) {
        	isGrounded = true;
            //접촉한 오브젝트의 태그가 platform 일 때,
            if (collision.gameObject.tag == "Platform") {
            	//접촉한 순간의 오브젝트 위치를 저장
                contactPlatform = collision.gameObject;
                platformPosition = contactPlatform.transform.position;
                //접촉한 순간의 오브젝트 위치와 캐릭터 위치의 차이를 distance에 저장
                distance = platformPosition - transform.position;
            }         
        }
	}
}

그래 이거지
움직일 때는 요래요래

 

반응형

댓글