본문 바로가기
유니티

유니티 4일차

by 육지상어 2020. 12. 20.
728x90
반응형

첫 시간에 한건 재귀함수이다.

//재귀함수
//함수안에서 함수인 자기
//자신을 호출하는 함수
void HelloUnity(int count)
{
if (count == 0)
//만약 count가 0이라면
return; //함수를 끝냄
Debug.Log("유니티");
HelloUnity(--count);
//count를 감소시킨상태로 재귀호출

    //재귀함수를 사용하기 위해서는 
    //종료 조건을 만들어 주어야함
}
void Start()
{
    HelloUnity(5);
}

하나 눈에 띄는건 종료 조건을 만들어주는것이다.

그 다음에는 어웨이크, 온에이블, 스타트의 개념이다
어웨이크 온에이블은 스크립트 생성시 자동생성이 아닌데
그냥 실행된다.

//생명주기 : 유니티 자체적으로 호출을 하지 않아도
//자동적으로 호출이 되는 함수(메소드)

void Awake()
{
    Debug.Log("Awake 함수입니다.");
    //1. 게임이 실행될때 최초 1회 실행
    //2. 가장 먼저 실행됨(Start함수보다 빠름)
    //3. 오브젝트가 활성화 상태여야함
    //4. 스크립트가 비활성화 상태여도 실행됨
    //5. Awake 함수에서 변수들을 초기화 해주는 것을
    //   권장
}

void OnEnable()
{
    Debug.Log("OnEnable 함수입니다.");
    //1. 오브젝트의 활성화 마다 1회 실행
}

void Start()
{
    Debug.Log("Start 함수입니다.");
    //1. 게임이 실행될 때 최초 1회 실행
    //2. 오브젝트가 활성화 상태여야함
    //3. 스크립트가 활성화 상태여야함
    //4. 변수초기화에 주로 사용
}
//게임실행시 Awake -> OnEnable -> Start 함수 순으로 실행됨

온에이블은 하이라이키가 활성화할때 시작된다.

void Update()
{
Debug.Log("Update 함수입니다." + Time.deltaTime);
//프레임마다 호출되는 함수
//게임의 핵심로직에 사용됨
}
void LateUpdate()
{
Debug.Log("LateUpdate 함수입니다." + Time.deltaTime);
//Update 함수 실행된 이후에 실행됨
}
void FixedUpdate()
{
Debug.Log("FixedUpdate 함수입니다." + Time.deltaTime);
//일정한 간격으로 실행됨
//주로 물리적 계산에 이용됨
//Edit -> ProjectSetting -> Time 을 통해
// 실행 간격 조절 가능
}
void OnDisable()
{
Debug.Log("OnDisable 함수입니다.");
//오브젝트 비활성화시 호출
}
//Time.deltaTime : 업데이트 함수의 실행 주기를 확인 가능

이제는 주기적으로 업데이트되는 함수들인데, 업데이트 순서만 차이난다. 온 디스에이블은 오브젝트 비활성화시 호출
업데이트 속도를 조절하려면 -> 에딧 ->프로젝트 세팅 -> 타임에서 조절할 수 있다.

보통 조절시 타임.델타타임으로 일정한 속도를 조절하는데 이를 조절시 FPS 프레임 포 세컨드? 라고하는데 F랑 P가 좀 이상하지않나
이동시, time.deltatime을 곱해주는 이유는, 컴퓨터간에 이동거리를 맞춰주기 위해서이다.

다음은 invoke 함수인데,
void Start()
{
Invoke("Play", 1);
//실행할 함수, 지연시간
InvokeRepeating("Play2", 2, 1);
//실행할 함수, 처음지연시간, 반복지연시간
}
void Play()
{
GameObject obj =GameObject.CreatePrimitive(PrimitiveType.Sphere);
}

void Play2()
{
    GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Cube);
    obj.transform.position = new Vector3
        (Random.Range(0, 4), Random.Range(0, 4), Random.Range(0, 4));
    //Random.Range(이상, 미만) : 랜덤한 값을 추출해줌
}
private void Update()
{
    if (Input.GetKeyDown(KeyCode.A))
    {
        CancelInvoke("Play2"); //Invoke 중지
    }
}

하나는 동그라미, 하나는 큐브를 생성하는 함수는 지연반복해서 계속 생성한다.여기서 랜덤 함수도 나온다.
게임 오브젝트를 만든 후, 포지션을 지정해준다. 0~4로 주고 다 랜덤

void Start()
{
StartCoroutine("Play");
}

IEnumerator Play()
{
    Debug.Log("1. 첫번째 실행");
    yield return new WaitForSeconds(0.3f);
    Debug.Log("2. 두번째 실행");
    yield return new WaitForSeconds(1.4f);
    Debug.Log("3. 세번째 실행");

    StartCoroutine("Play");
    //재귀함수 무한 반복
}

다음은 cCoroution 인거같다? 스타트 코루틴
이넘메이터는 옐드 리턴을 써서, 반환을 해줘야한다.
웨이트 포 세컨드 0.3초간 다른일을 하고, 다시 돌아와라

이건 웨이트 포 루틴은 이넘메이터안에서만 옐드 리턴을 써서 반환 형태로 사용해야한다.
그냥 일반 지연함수랑 다른게 무엇일까?

옐드 리턴 지연함수 외에도 특정 조건, 으로 활용할 수 있기에 단순 지연을 사용하는거보다 특정 조건 (렌더링 완성 등)

public GameObject Enemy;

// Update is called once per frame
void Update()
{
    if (Input.GetKeyDown(KeyCode.Z))
    {
        Enemy.SetActive(false);
    }
    if (Input.GetKeyDown(KeyCode.X))
    {
        Enemy.SetActive(true);
    }
}

셋엑티브 펄스 트루를 해주면, 오브젝트를 활성화 비활성화
퍼블릭을 써주면 인스펙터창에서 볼 수 있고 참조를 할 수 있다.

오브젝트를 하나 만들고 선택해주면, 에너미를 넣을 수 있다. 다만 오브젝트 비활성시에는 그 오브젝트 안에 있던게 동작하지 않는다.

디스트로이는 아에 제거고, 셋액티브는 재활용할 때 사용한다.

반응형

'유니티' 카테고리의 다른 글

유니티 7일차  (0) 2021.01.10
유니티 5일차  (0) 2020.12.31
유니티 수업 3일차  (0) 2020.12.13
유니티 2일차  (0) 2020.12.08
유니티 수업 1일차  (0) 2020.11.30

댓글