[Unity] 7. 특정 지점으로 오브젝트 이동
공부/Unity

[Unity] 7. 특정 지점으로 오브젝트 이동

하이하이

와타시 기계과 감성쟁이!

 

Today we're gonna learn about how to move the object!

 

와!!

 

1. MoveTowards (현재 위치, 목표 위치, 속력)


 

transform.postion() 은 오브젝트의 위치를 결정하는 함수입니다.

 

Vector3.MoveTowards(현재 위치, 목표 위치, 속력) 은 해당 값들을 매개변수로 사용합니다.

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

public class move : MonoBehaviour
{
    Vector3 destination = new Vector3 (3, 4, 5);
    void Update()
    {
        transform.position =
            Vector3.MoveTowards(transform.position, destination, 1);
    }

}

gif를 만들기도 그렇고, 녹화를 하기도 그렇고 참 애매하네요.

어쨋거나 움직입니다.

 

근데 좀 끊기는 느낌이 있어요.

잠시만, 근데 왜 현재위치에 transform.postion이 들어갈까요?

 

궁금해진 감성쟁이는 실험을 해봅니다.

 

가설은

'현재위치에서 목표위치 방향으로 속력만큼 움직인다' 였습니다.

 

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

public class move : MonoBehaviour
{
    Vector3 start = new Vector3(0, 0, 0);
    Vector3 destination = new Vector3 (3, 3, 3);

    void Update()
    {
        transform.position =
            Vector3.MoveTowards(start , destination, 1);
    }

}

Position 성분 하나를 제곱하고, 3을 곱한 뒤 루트를 씌워주니까 1이 나왔습니다.

제 생각이 맞았군요.

 

그리고 (3,3,3)에 도달하지 못하는 이유는

초기 위치가 (0,0,0)으로 계속 초기화 되기 때문입니다.

 

2. SmoothDamp (현재 위치, 목표 위치, 참조 속력, 소요 시간)


 

SmoothDamp (현재위치, 목표위치, 참조 속력, 소요 시간) 은 해당 값들을 매개변수로 사용합니다.

목표위치에 부드럽게 도착합니다.

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

public class move : MonoBehaviour
{
    Vector3 destination = new Vector3 (3, 3, 3);

    void Update()
    {
        /*
        transform.position =
            Vector3.MoveTowards(start , destination, 1);
        */

        Vector3 speed = Vector3.zero; // (0,0,0) 은 .zero 로도 표현가능
        transform.position = Vector3.SmoothDamp(transform.position, destination, ref speed, 0.1f);
    }

}

"아니 0.1초 만에 가야하는거 아님?????????"

이라고 하시겠지만...

 

 

부동소수점 - 위키백과, 우리 모두의 백과사전

초기의 전기기계식 프로그래밍 가능한 컴퓨터 Z3에는 부동소수점 산술 기능이 포함되었다. (뮌헨의 국립 독일 박물관) 부동소수점(浮動小數點, floating point) 또는 떠돌이 소수점[1] 방식은 실수를

ko.wikipedia.org

 

부동소수점에 의한 컴퓨터의 태생적 실수 연산 문제이므로,,,

넘어가줍시다,,,

 

 

(유니티 질문) SmoothDamp랑 Vector3.Lerp 질문 - 인디 게임 개발 갤러리

현재 포지션 -> 목표 포지션으로  이동해야할때 두개를 전부다 써봤는데요 if(현재 포지션 == 목표포지션){    isMove = false;}이렇게해놨는데분명히 예상도착시간설정은 3초로해놨는데 30초가

gall.dcinside.com

 

에 의하면,,, 이로 인해 생길 수 있는 문제들을 해결하는 방법들도 있으니 참고하세요,,,

 

선생님 그러면 참조속도는 뭐에요??

 

 

[C#]ref와 out  키워드

ref와 out 키워드 ref 및 out 키워드는 메서드 또는 함수 내에서 인수를 전달하는 데 사용됩니다. 둘 다 인수 / 매개 변수가 참조로 전달되었음을 나타냅니다. 공통점 ref와 out은 런타임에 다르게 처

developer-talk.tistory.com

 

ref 와 참조에 대한 글이다.

 

어떤 메소드에서 어떤 값이 변경되었을 때,

다른 메소드에서 그 변경된 값을 호출하고 싶으면 ref를 사용한다는 말.

 

 

SmoothDamp에 관해 질문 있습니다. - 인프런 | 질문 & 답변

어메이징 볼링 - 타겟 추적기 영상을 수강중에 질문이 있습니다.SmoothDamp기능에 대한 질문입니다만, 이 smoothDamp라는 것은 Update를 통해서 함수를 몇 번을 실행시키든지, 지정된 시간(영상에서라면

www.inflearn.com

 

단순하게 이해하자면, smooth 한 움직임을 위해서는 곡선형태의 그래프가 그려져야하고

이를 위해선 이전 값을 알아야하므로, 그 이전 값을 참조 속도(위에서는 ref speed)에 저장하여 이용하는 것입니다.

 

정확한 원리에 대해서는 모르겠어요!! 당당당당 숭구리당당

 


 

출처 : https://docs.unity3d.com/ScriptReference/Vector3.html

위 코드에서 (0,0,0)을 Vecor3.zero 로 표현했는데,

zero 부분은 캡쳐 속 키워드들로도 변경 가능합니다.

 

3. Lerp (현재 위치, 목표 위치, 보간 간격)


 

Lerp (현재 위치, 목표 위치, 보간 후 위치) 는 선형보간을 이용한 이동 함수입니다.

 

선형보간은 영어로 Linear interpolation 이라고 하는 수치해석의 한 방법인데,

 

 https://www.keil.com/pack/doc/CMSIS/DSP/html/group__LinearInterpolate.html

위 그래프처럼 임의의 두 점을 대상으로 Linear interpolation을 취하면

 

이 성립합니다.

 

이걸 이해한다면

 

 

저 Returns 값을 이해하실 수 있을 겁니다.

 

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

public class move : MonoBehaviour
{
    Vector3 destination = new Vector3(3, 3, 3);

    void Update()
    {
        /*
        transform.position =
            Vector3.MoveTowards(start , destination, 1);
        */

        Vector3 speed = Vector3.zero; // (0,0,0) 은 .zero 로도 표현가능
        transform.position = Vector3.Lerp(transform.position, destination, 0.001f);
    }

}

 

t 가 작을수록, 간격이 작아지므로 속도가 느려집니다.

물론 그만큼 부드러운 움직임을 보여줘요.

 

4. Slerp (현재 위치, 목표 위치, 보간 간격)


 

Slerp (현재 위치, 목표 위치, 보간 간격) 은 구면 보간을 이용합니다.

따라서, 움직임도 호을 따라가요!

 

매개변수에 대한 개념은 선형보간과 같습니다.

다만, 선형이 아니라 구의 겉면을 따라 간다는 점이 다릅니다.

 

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

public class move : MonoBehaviour
{
    Vector3 destination = new Vector3(-5, -3, 0);

    void Update()
    {
        /*
        transform.position =
            Vector3.MoveTowards(start , destination, 1);
        */

        /*
        Vector3 speed = Vector3.zero; // (0,0,0) 은 .zero 로도 표현가능
        transform.position = Vector3.Lerp(transform.position, destination, 0.001f);
        */

        transform.position = Vector3.Slerp(transform.position, destination, 0.01f);
    }

}

 

Slerp 는 내부 계산에 따라 매번 궤적이 달라진다고 합니다.

그래서인지 저는 선형으로 가네요 ㅠㅠ

 


오늘은 여기까지

그럼 안녕

 

(김계란 아저씨 톤)