게임/개발

|유니티| 4 | 충돌 감지 & 아이템과 배열

no title

아이템과 장애물

1. 메소드

함수를 만드는것이다

1. 특정 오브젝트간 Distence 구하기

//Target에 오브젝트Name을 문자열로 넣으면
//Find가 오브젝트를 검색한다
void Update(){
    TragetDist("Text (TMP)");
}

void TargetDistence(string Target){
     float thisToTargetDist = Vector3.Distance(
                GameObject.Find(_Target).transform.position, 
                transform.position
            );
    Debug.Log(_Target + " To " + this.gameObject.ToString() + thisToTargetDist);
}

2. 충돌상대를 밀치기

  • Collision.gameObject 사용
    Debug.Log(Collision.gameObject.name);
    Debug.Log(Collision.gameObject.transform.postion);
    
  • 다음은 장애물에 들어가는 스크립트이다
    void OnCollisionEnter(Collision _collision)
    {
        Vector3 direction = _collision.gameObject.transform.position - transform.position;
        direction = direction.normalized * 1000;
        _collision.gameObject.GetComponent<Rigidbody>().AddForce(direction);
    }
    
    • 그런데 Update에 들어가지 않는다.. 왜???
    • OnCollisionEnter게임엔진에서 호출해주는 메소드이다.
      충돌이 발생하면 그 때 유니티 엔진에서 저 메소드를 자동 호출한다.
      그래서 우리가 직접 호출할 필요가 없다.

결과

  • 공이 장애물에 부딛히면서 튕겨나가는것을 볼 수 있다.

4. Collider에서 일어나는 충돌

  • 충돌은 Transform Scale이 아닌 Collider 에서 일어난다.
    다음 GIF는 콜라이더 범위(초록색) 범위에 들어가야 실행되는것이 확인된다

Nomalize?

Vector3 direction = direction.normalized;
  • 이를 벡터의 정규화라고 한다.
    벡터의 방향은 그대로 두고 크기만 1.0으로 맞춰 주는 것입니다.
    항상 곱하는 상수 크기를 일정하게 가질 수 있도록 만들어주는것

👿!! GetComponent<> 주의점!!👿

GetComponent<>()이다!!!
GetComponent 사용시 항상 괄호를 붙여라
간혹 뺴놓는경우가 있는데 그러지마라

2. 트리거

  • 충돌감지 & 트리거
    void OnCollisionEnter(Collider ___) //두 물체간에 충돌이 일어났을때 발생한다.
    void OnTriggerEnter(Collider ___) //트리거가 작동했을떄 발생
    

1. 매쉬 랜더러

  • 매쉬 랜더러는 오브젝트를 렌더링 욥션을
    결정할 수 있고 랜더링을 할지 안할지 결정할 수 있다.

    랜더링 ON 랜더링 OFF (투명 벽)

2. isTriger

  • 물리적 적용을 할지 아니면
    그냥 지나갔다는 트리거로 발생시킬지 결정 시킬수 있다

3. 게임 재시작

  • Application.LoadLevel("___.unity")
    우리가 항상 봐왔던 로딩창과 게임로딩 같은 역활을 하는 명령어다
    //유니티 파일은 일종의 방 혹은 게임이다.
    Application.LoadLevel("___.unity")
    
  • 다음은 .unity 파일

결과

  • 다음은 여러개의 GIF 반복이 아니라 정말로 새로 시작되는 중이다.

3. 코인먹기

void OnTriggerEnter(Collision ___) 을 이용해서 코인을 먹어보자

void OnTriggerEnter(Collider _col){
    if(_col.gameObject.name == "Ball"){
        Destroy(gameObject);
    }
}
  • 1.복수선택
    다음과 같이 드래그하고 인스펙터창에서 값 변경을하면 동일하게 변경가능하다

코인먹기 결과

배열

여러개의 변수를 저장해보자

1. C# 배열 선언

  • 배열 C#에서 선언은 다음과 같다
    <자료형> [] _ARRAY_ = new <자료형>[_SIZE_];
    

2. Tag(태그)

  • 게임 오브젝트는 태그를 가지고 있다.
  • 여러개 종류의 오브젝트를 가르킬때 사용한다.

    Default값 : Untagged

1. 태그의 추가

  • 1. add tag
  • 2. tag 선택 (복수선택 가능)

2. 태그의 적용

  • 같은,복사된 다수 오브젝트에 접근이 가능하다.
  • 다음 스크립트는 태그이름과 동일한 오브젝트를 전부 넣는다.
    //메인 카메라에 들어가는 스크립트다
    GameObject[] _TagARR_ = GameObject.FindGameObjectsWithTag("_태그이름_");
    

3. C# For 반복문

  • C와 반복문을 비슷하게 쓸 수 있다 : 수식기반
    for(int i = 0 ; i < N; i++) {}
    
  • 이터레이터도 사용할 수도 있다 : 배열기반
    foreach(<자료형> E in 배열)
    

4. 아이템 먹고 장애물 없에기

  • 빨간 코인을 먹으면 장애물이 모두 없어지게 하고싶다

  • 스크립트는 다음과 같다

    //OntriggerEnter으로 접촉했는지 감지
    //매개변수 콜라이더 _col은 들이받은 오브젝트를 의미함
    void OnTriggerEnter(Collider _col){
        //들이받은 오브젝트가 "공"이라면
        if(_col.gameObject.name == "Ball"){
            //_Obstacle이라는 인자를 받는 함수호출
                //인자값의 태그를 지닌 오브젝트 삭제
            DestroyObstacle("_Obstacle");
            //또한 코인 그 자기자신을 표현하는 gameObject도 삭제
            Destroy(gameObject);
        }
    }
    void DestroyObstacle(string _Target){
        //GameObject 클래스 배열을 생성한다 -> 매개변수 문자열 태그를 가지는 장애물 삭제
        GameObject[] ObstaclesArr = GameObject.FindGameObjectsWithTag(_Target);
        foreach(GameObject E in ObstaclesArr){
            Destroy(E);
        }
    }
    

레드 코인먹기 결과 (장애물 전부 제거)


❓❓❓ 의문점 ❓❓❓

1. 충돌할때마다 소리가 들리게 하자 ❓(다음에 찾아보기)

  • 추측 : 다음 트리거 엔터에 소리 들리게끔 하면 되지 않을까?
    void OnTriggerEnter(Collider _col){
        if(_col.gameObject.name == "Ball"){
            오디오재생();
            Destroy(gameObject);
        }
    }
    
1. 미디 파일 연결하기

2. 스프라이트 오브젝트로 표현하는 법 ❓(다음에 찾아보기)

3. 애니메이션 넣는법 ❓(다음에 찾아보기)

4. 오브젝트 인스펙터의 static의 역할 ❓(다음에 찾아보기)

  • 여기서 Static의 설정은?
두 설정 비교

1. 자식들 static ON (부모 제외 )

  • 자세히 보면 collider만 음직이는것을 볼 수 있다.

2. 부모와 자식 전부 static

  • 정상적으로 부모의 음직임을 따라가는것을 알 수 있다.