2014. 7. 9. 14:45ㆍ프로그래밍/Unity
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);
}
'프로그래밍 > 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 |