SendMessage()

2014. 7. 9. 14:45프로그래밍/Unity

반응형
SMALL

SendMessage("MethodName") 함수는 다른 오브젝트의 함수를 호출하는데 유용하게 쓸수 있는 함수다.

 

SendMessage("MethodName", _arg) 로 인자값을 하나 넘길수도 있다.

 

그런데 사용하다보면 sendmessage ~~~~ has no receiver 라는 에러가 발생하는 경우가 종종 있다.

 

이건 말그대로 지정해준 함수를 찾지 못하겠다는 이야기이다.

 

기본적으로 SendMessage 는 해당 스크립트를 가지고 있는 게임오브젝트 내에 존재하는 함수를 검색한다.

 

그렇기 때문에 이부분에서 잠시 착각하면 함수를 못 찾는 경우가 발생할 수 있다.

 

 

 

아래의 코루틴을 보라.(이 코루틴만 독립된 싱글턴 스크립트 KhjCoroutines에 두었다.)

어떤 대상오브젝트를 지정시간동안 스타트에서 앤드위치로 이동시키는 코루틴이다. 그리고 이동종료후에 어떤 함수를 호출할 것인지 옵션으로 달아두었다.

여기서  target.SendMessage(endMethod); 이냐  go.SendMessage(endMethod); 이냐의 갈림길에서 착각할 수 있다.

 

이동한 오브젝트에 달려있는 함수라면 go 로부터 호출해야하고,

이 코루틴을 호출한 스크립트에 달려있는 함수를 부르고 싶다면 target을 tish.gameObject로 지정해줘야 할 것이다.

 

StartCoroutine( KhjCoroutines.Instance.ObjMove(moveObj.gameObject, 1f, moveObj.transform.position, goal.transform.position, "MoveEnd", gameObject) );
위의 방식으로 호출하여 코루틴 동작완료후에 호출한 스크립트의  MoveEnd()를 시작할수 있다.

 

핵심은 샌드메세지로 부를 함수가 어떤 오브젝트에 붙어있는가 이다.

그 오브젝트를 대상으로 샌드메세지를 한다는 것을 기억한다면, sendmessage ~~~~ has no receiver 에러는 피할 수 있을것이다.

 

 

public IEnumerator ObjMove(GameObject go, float time, Vector3 startPos, Vector3 EndPos, string endMethod = null, GameObject target = null)
 {
  yield return new WaitForSeconds(0.1f);
  float elapseTime = 0f;
  float temp=0f;
  while(elapseTime < time)
  {
   elapseTime += Time.deltaTime;
   temp += Time.deltaTime*2;
   if(temp >= time)
    temp = time;
   if(elapseTime >=time)
    elapseTime = time;
   go.transform.localPosition = startPos + (EndPos - startPos)* ((elapseTime/time)/2 + (temp/time)/2 ) ;
   
   yield return new WaitForEndOfFrame();
  }
  if(endMethod !=null && endMethod.Equals("")==false)
   target.SendMessage(endMethod);
 } 

 

 

반응형
LIST

'프로그래밍 > Unity' 카테고리의 다른 글

UITexture의 모양 변형하기 ( 둥근 라운드형 )  (4) 2015.01.30
TypeLoadException  (0) 2014.07.29
Unity 일정시간 후에 함수호출  (0) 2014.07.02
Ngui label에 색상 적용하기  (0) 2014.07.02
Random.Range() 범위  (0) 2014.06.27