1인개발/유니티

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

MaskOfDali 2020. 7. 18. 23:01
반응형

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

 

아이 숭해

 

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

 

 

  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;
            }         
        }
	}
}

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

 

반응형