따..딱히 공부하려고 포스팅하는 건 아니니까..!
Unity 오브젝트 드래그한 지점까지 옮기기 본문
// 오브젝트의 충돌체
private Collider _collide;
// 현재 좌표
private Vector3 _curPosition;
// 목표 좌표
private Vector3 _direction;
// 마우스와 오브젝트가 충돌했는지 체크
private bool _isTrigger = false;
void Start()
{
// 오브젝트의 충돌체를 가져옴
_collide = GetComponent<Collider>();
}
IEnumerator OnMouseDown()
{
// 오브젝트의 월드 좌표를 스크린 좌표로 변환
Vector3 scrSpace = Camera.main.WorldToScreenPoint( transform.position );
// 오브젝트 월드벡터 - 마우스 월드벡터 (벡터끼리의 차는 서로의 거리와 방향을 뜻함. 여기서는 마우스에서 오브젝트까지의 벡터)
Vector3 offset = transform.position - Camera.main.ScreenToWorldPoint( new Vector3( Input.mousePosition.x, Input.mousePosition.y, scrSpace.z ) );
// 마우스를 누르고 있을때 루프
while ( Input.GetMouseButton( 0 ) )
{
// 현재 마우스의 스크린좌표
Vector3 curScreenSpace = new Vector3( Input.mousePosition.x, Input.mousePosition.y, scrSpace.z );
// 마우스 벡터 + 마우스->오브젝트 벡터 = 마우스 월드 좌표
_curPosition = Camera.main.ScreenToWorldPoint( curScreenSpace ) + offset;
yield return null;
}
}
void OnMouseUp()
{
_isTrigger = true;
}
void Update()
{
if ( _isTrigger )
{
float step = 5 * Time.deltaTime;
// MoveTowards : 처음 위치에서 목표 위치까지 이동하는 함수
transform.position = Vector3.MoveTowards( transform.position, _curPosition, step );
}
// 초기화
if ( transform.position == _curPosition )
{
_isTrigger = false;
}
}
transform.Translate를 사용하면 목표 지점까지 정확히 이동하기가 어렵습니다.(Time.delta는 거의 난수처럼 증가하는 수이므로 10까지 증가하는 것이 목표라고 가정했을 때, 정확히 10이라는 숫자가 나오기 힘듭니다.) 그러므로 특정 지점으로 옮기고 싶다면 유니티에서 제공하는 MoveTowards나 다른 에셋(ITween 등) 사용을 권합니다.
'프로그래밍' 카테고리의 다른 글
꼬리 재귀 최적화(Tail Recursion) (3) | 2016.06.25 |
---|---|
컴파일의 원리 (0) | 2016.06.17 |
OOP의 5대 원칙 (0) | 2016.06.15 |
C와 C#의 차이 (0) | 2016.06.15 |
[SlideShare] 컴포넌트를 기반으로 한 게임 오브젝트 설계하기 (0) | 2016.04.22 |