본문 바로가기

▶Programming/Unity

유니티 유용한 함수들

Clamp: 오브젝트의 범위를 정해준다. 예를들어 슈팅게임을 만든다고 하면 맵을 벗어나지 않고 움직이게 해야한다. 

그때 이 함수를 사용한다.


Mathf.Clamp(GetComponent<Rigidbody>().position.x, xMin, xMax):  position.x는 현재 위치 xMin은 최소, xMax는 최대



===================================================================================================================

**Quaternion : 회전을 위한 함수 라고 간단하게 생각하자.


**Quaternion.LookRotation(벡터값) : 쉽게 얘기해서 target을 기준으로 회전한다. similar to the LookAt() method, the object is always watching objects.


public class LookAtScript : MonoBehaviour 

{

    public Transform target;

    

    void Update () 

    {

        Vector3 relativePos = target.position - transform.position;

        transform.rotation = Quaternion.LookRotation(relativePos);

    }

}




**Quaternion.Euler(x,y,z): 각 축을 기준으로 기울이기.

public float tilt;//기울기

float HorizontalMove = Input.GetAxis("Horizontal");

HorizontalMove = HorizontalMove * Speed * Time.deltaTime;

GetComponent<Rigidbody>().rotation = Quaternion.Euler(0.0f, 0.0f, HorizontalMove*-tilt);

위의 코드를 대충 얘기하자면 리지드바디의 회전(rotation)을 z축을 기준으로 하는 것.



**Quaternion.FromToRotation(from벡터, to벡터,회전속도) :

잘은 모르겠지만 실험해본 결과 from벡터가 to벡터 기준으로 확 기울어 버린다. 

나중에 다른 곳에서 써보고 유용하면 동영상을 올려야겠다.


**Quaternion.Slerp(쿼터니언A, 쿼터니언B,t): A에서 B로 회전 회전속도는 t

위에서 말했던 LookRotation과 효과는 같다. 오브젝트가 회전하여 target을 바라본다.

그러면 왜 Slerp을 사용할까? 그것은 실제 유니티의 play버튼을 누르면 알 수 있다.

LookRotation이 play버튼을 누르자마자(다른 함수없이 LookRotation만 사용!!) target을 바라보는 반면,

Slerp은 서서히 타겟방향으로 회전한다. 즉, 서서히 몸을 돌리는 것 처럼 보인다.


<LookRotation>



 <Slerp>


Quaternion.identity : 이녀석은 Quaternion은 써야되는데...굳이 회전이나 그런게 필요 없을 때 사용.

아래 Instantiate에서 rotation이 쿼터니언임을 알 수 있는데..형식상 써줘야 될 때 쓰면 될 듯.

===================================================================================================================

Instantiate =이녀석은 오브젝트를 복사하고 클론을 만들어 준다. 즉 미사일 같이 여러개의 오브젝트가 필요로 한 경우에 사용하면 좋다.

사용: Instantiate(object, position==벡터3, rotation==쿼터이언)


Input.GetButton("Fire1") : 마우스 왼쪽 버튼을 누르면 발사(fire)하도록 함수를 지정할 수 있다.


OnTriggerExit :트리거를 멈췄을 때 즉, 트리거를 작동한 오브젝트와 접속이 없을 경우 발생하는 함수.


GetComponent<Rigidbody>().angularVelocity : 각속도..이게 뭐냐면 리지드바디 오브젝트가 회전하는 속도.

즉, 자신이 계속 도는 것.

GetComponent<Rigidbody>().angularVelocity = Random.insideUnitSphere <이런식으로 사용하여 랜덤으로 돌게 한다.


===================================================================================================================

**Vector3.Lerp(from 벡터 , to 벡터 , 시간 t)

transform.position = Vector3.Lerp(start.position, end.position, Time.time); 보통 이런식으로 많이 사용. 

다른거에도 쓸 수 있겠지.. 사용이야 프로그래머 마음. start지점에서 end지점으로 이동한다. 




===================================================================================================================

**Coroutine : Invoke를 포괄하는 지연 호출 방법 원래 코루틴은 함수가 아닌데 그냥 여기에 쓰겠다. 따로 항목을 만들기 싫어서...

코루틴은 누가 그러길 진입 지점이 많은 함수라고 한다. 이 말은 내가 생각하기에 언제든 원하는 상태로 다시 실행 시키는게 아닌가 싶다.

예를들어 우리가 잘 아는 서브루틴(Subroutine)은 진입 지점이 하나인 함수이다. 함수 선언부에서 진입하고 return 구문으로 반환되면 다시 

처음부터 진입해야 하는데 코루틴은 그게 아니라고 한다. 코루틴은 yield return 구문으로 반환되고 다시 들어올 수 있다.

유니티에서 코루틴은 IEnumerator 인터페이스를 사용하여 실행 할 수 있다. 쉽게 게임을 예로들면 적을 계속해서 무한대로 리스폰 한다던가, 오브젝트를 이동하는 코드를 Update없이 짤 수 있다. 이건 상당히 의미있는데 왜냐하면 유니티 전에 리소스 활용에서 Update()에 모두 때려 박는 것 보다 Coroutine으로 나눠 하는게 훨씬 낫기 때문이다. 

포인트는 반복에 있다. 그래서 while문과 잘 쓰인다. 물론 위 글 중 대부분은 내 개인적인 생각이다.


IEnumerator 메소드이름(파라미터){ yield 빠져나갈 조건} <-이런식으로 사용.



===================================================================================================================

void Awake():Awake is called when the script instance is being loaded. (스크립트 개체를 로딩 할때 호출)

초기화 할 때 사용. Start()와 차이점. Start() 보다 먼저 호출. Awake() 함수는 모든 오브젝트가 초기화된 후 호출되기 때문에, 다른 오브젝트에 메시지를 보내거나 FindWithTag 같은 함수를 안전하게 사용할 수 있음. 

Start()함수는 Update함수가 호출되기 직전에 호출. 한번만 호출 됌. Awake 함수와의 차이는 Start 함수는 스크립트가 켜져있을 때만 호출된다는 것!!


===================================================================================================================

OnTriggerEnter vs OnTriggerStay

OnTriggerEnter 는 접촉 했을 때 한번 발생. 쉽게 얘기해서 한번 만나면 그 다음엔 유니티가 신경쓰지 않는다. 떨어졌다가 다시 만날 때 또 다시 한번 접촉했다고 판단함.


반면에, OnTriggerStay 는 접촉 하고 있는 상태에서도 계속적으로 '접촉하고 있음' 을 알려줌. 즉 Stay다. 충돌이 되고 있는 상태동안에는 계속해서 충돌중이라고 알려줌.



===================================================================================================================

Quaternion.Lerp(Quaternion from, Quaternion to, float t) vs Quaternion.Slerp(Quaternion from, Quaternion to, float t)


Lerp이 Slerp보다 빠르다. 대신 멀리 to에 들어가는 퀴테니언이 멀 경우 회전이 나쁘게 보이는 단점이 있다.

(This is faster than Slerp but looks worse if the rotations are far apart.)