※ 부모에 접근하기 현재.parent.Getcomponent<>
※ 유니티 스크립트상 함수에서 불필요한 부분은 최대한 하지않고, 빠져나가는 것이 성능 향상에 좋다.
※ 함수 등의 커서 놓고 F12 누르면 정의부로 날라갈수있음
내가 겪었던 애니메이션이 Legacy 안되있는거 해결법
탭 메누에서 Noraml 로 되어있을 것을 Debug 모드로 가서 Legacy 를 체크해주면 된다.
실행 화면에 상태 같은것을 띄우기 ! OnGUI() 함수
GUI. 으로 이것저것 접근이 가능한데 첽이 다달았을때, You Are Dead 체력이 남아있을땐 체력이 표시되게하는 코드이다.
void OnGUI()
{
float x = (Screen.width / 2.0f) - 100; ※ Screen.width 로 현재 화면의 크기에 대한 값을 가져올수 있다.
Rect rect = new Rect(x, 10, 200, 25); ※ 사각형을 만들어주는 코드이다, ( 가로위치,세로위치, Width,Height )
if (isDead)
{
GUI.Box(rect, "You Are Dead "); ※ 박스를 만들고, 그 형태와 띄울 문장 등을 받아온다. ( 사각형, 문구 )
}
else
{
GUI.Box(rect, "MyHealth : " + healthPoint);
}
}
부모를 없애는법 (?) 만드는 법 엥 이거완전 패드립아니냐
transfrm.parent = NULL 로 한다면 이순간 부모가 사라지므로 최상위 오브젝틀 되어버린다 ! 반대로 부모를만들려면
transform.parent = 무언가로 세팅을 한다면 그 밑으로 들어가게 된다.
스크립트 실행순서
Edit - Poroject Setting - Script Exclusion Order 에서 스크립트의 실행순서를 정해줄수있다. Deafult 위는 더빨리 / 아래는 더 늦게 호출된다.
유니티 돌아가는 방식
100개의 오브젝트가 있는데,
처음 시작할때 80개만 있다고 치자,
그러면 80개의 Start 를 시작시킨다. 정렬안시키고 그냥 무작위로 아무거나 한다. 그냥 호출한다.
그리고 다들 Update가 호출다 된다. 모든 80개의 오브젝트의 update 가 끝나면 다음으로 넘어간다.
Lateupdate 가 호출되는데 코루틴이 이쯤에 호출된다. 이것까지 끝나면 드디어 화면에 그린다.
즉 Update 에서 뭔가 바꾸든 LateUpdate 에서 바꾸든 문제가없다. 어차피 모두 종료된 후에 그리니까
결론 : 의존성 있는 스크립트가 있을경우, 그 순서를 잘 미리 세팅을 해놓자 Scrpit Exclusion Order 에서 !
드디어 나왔다. 코루틴 Coroutine ( 멀티 스레드 같은 개념 )
코루틴이 호출되는 순간 주 Script는 그대로 쭉 가고 동시에 Corutine 의 흐름이 또 생겼다가 종료된다.
유니티는 싱글스레드이다. 개념적으로 멀티스레드 이지만.
반환형이 IEnumerator 인 경우 코루틴 함수이다. 라고 알면된다.
외부에서 코루틴 함수를 직접 호출하지말고 다른 함수를 통해서 호출하도록 하자
코루틴 함수는 무조건 StartCoroutine 으로 호출해야한다.
yield return을 최소한번은 하자.
return null 과 return WaitForEndOfFrame() 의 차이는 null은 그냥 update 수 정도고
frame 은 화면 갱신되는 횟수이다.
return null
return new WaitForSeconds( float ) 지정된 초만큼 대기
return new WaitForEndOfFrame() 렌더링 작업이 끝날 때 까지 대기
return new WaitForFixedUpdate() 다음 물리프레임까지 대기
return StartCoRoutine ( STRING ) 다른 코루틴이 끝날때까지 대기 쓰지말자
return new WWW( sTRING ) 웹 통신작업이 끝날 때까지 대기
return new AsyncOperation 비동기작업이 끝날 때 까지 대기 ( 씬로딩,씬전환 )
코루틴은 오브젝트 단위로 생성된다. 즉 StopAllCorutines 를 부른 오브젝트 안에있는 코루틴드란멈춰진다.
코루틴 부르는 두가지 방법 StartCoroutine( 함수 ( 인자 ) ) 혹은 StartCoroutine("함수이름")
후자의 장점 StopCoroutine("함수이름") 이 가능함
단 뒤에있는 케이스는 인자가 없는 함수만이 가능함
전자의 케이스를 종료시키는 방법 : Coroutine 변수를 선언해서 미리 받아놓고 그 변수를통해 종료가능
코루틴 함수명을 일반함수처럼 짓는건 되도록 피하자, 햇갈릴수있다.
Camera Shaking
Vector3 localPosition = Vector3.zero;
void Start()
{
localPosition = transform.localPosition; ※ 원래의 카메라 위치 기억
}
Coroutine currentCoroutine ;
public void PlayCameraShake() ※ 외부에서 코루틴함수를 바로 호출 안하고, 함수를 통해 호출
{
StopAllCoroutines();
if( currentCoroutine != null ){
StopCoroutine(curentCoroutine) ;
currrentCoroutine = nul ;
}
currentCouroutine = StartCoroutine(CameraShaking(1.0f, 0.2f));
}
IEnumerator CameraShaking(float shakeTime, float shakeSense)
{
float deltaTime = 0.0f;
while(deltaTime < shakeTime)
{
deltaTime += Time.deltaTime;
transform.localPosition = localPosition;
Vector3 pos = Vector3.zero;
pos.x = Random.Range(-shakeSense, shakeSense);
pos.y = Random.Range(-shakeSense, shakeSense);
pos.z = Random.Range(-shakeSense, shakeSense);
transform.localPosition = pos;
yield return new WaitForEndOfFrame();
}
transform.localPosition = localPosition;
yield return null;
}
죽음을 좀더 깔끔하게 구현해봅시다.