닷지게임

suhan cho·2022년 9월 24일
0

gameObject

  • gameObject 변수를 이용해 자신을 사용 중인 게임 오브젝트에 접근 가능

SetActive

GameObject타입에 내장되어 있는 메소드
1. gameObject를 사용해 자신의 게임 오브젝트에 접근
2. 접근한 게임 오브젝트의 SetActive(false)실행

public void Die()
{
	// 자신의 게임 오브젝트를 비활성화
	gameObject.SetActive(false);
}

GetComponent

  • 원하는 타입의 컴포넌트를 자신의 게임 오브젝트에서 찾아오는 메서드
  • GetComponent<Rigidbody>()는 자신의 오브젝트에서 rigidbody타입의 컴포넌트를 찾아서 가져온다
  • 찾으려는 타입이 오브젝트에 없으면 null을 반환

GetAxis

  • Input.GetKey 대신 Input.GetAxis
    -> 어떤 축에 대한 입력값을 숫자로 반환
float xInput = Input.GetAxis("Horizontal");
float zInput = Input.GetAxis("Vertical");

float xSpeed = xInput * speed;
float zSpeed = zInput * speed;

Vertor3 newVelocity = new Vector3(xSpeed, 0f, zSpeed);
playerRigidbody.velocity = newVelocity;
  • Rigidbody는 Vector3 타입의 velocity변수를 제공
    velocity로 현재 속도 알 수 있음

  • AddForce() 와 velocity 차이

    • AddForce()는 힘을 누적하고 속력을 점진적으로 증가
    • velocity를 수정하는 것은 이전 속도를 지우고 새로운 속도 사용 관성 무시하고 속도 즉시 변경
  • Horizontal 축과 Vertical축은 xbox같은 콘솔 게임기에도 적용 가능

  • 입력을 숫자로 받는 이유는 아날로그 스틱의 경우 살짝미는 경우도 있기 때문에다

trigger collider

  • 탄알이 다른 탄알에 충돌했을 때 튕겨나가지 않고 그냥 통과하도록 만들 것이다.
  • trigger collider은 충돌한 물체를 밀어내는 물리적인 표면이 없다.
    -> 다른 일반 콜라이더와 겹치거나 서로를 뚫고 지나갈 수 있지만 충돌 자체는 감지

transform

  • 게임 오브젝트의 위치, 크기, 회전을 담당하는 컴포넌트
  • 게임 오브젝트의 트랜스폼 컴포넌트를 코드 상에서 transform변수로 즉시 접근할 수 있도록 구성
    -> GetComponent<Transform>사용 할 필요 없다.

Destroy

// 게임 오브젝트에서 Rigidbody 컴포넌트를 찾아 bulletRigidbody에 할당
bulletRigidbody = GetComponent<Rigidbody>();
// 리지드바디의 속도 = 앞쪽 방향 * 이동 속력
bulletRigidbody.velocity = transform.forward*speed;

//3초 뒤에 자신의 게임 오브젝트 파괴
Destory(gameobject, 3f);
  • 초단위로 삭제할 수 있다

충돌 처리

충돌 메시지를 발생시키는 것은 Rigidbody이므로 최소 하나의 게임 오브젝트는 Rigidbody 컴포넌트를 가지고 있어야 한다.

OnCollision : 일반 충돌

충돌한 두 콜라이더는 서로 통과하지 않고 밀어낸다

충돌 관련 정보를 담아두는 단순한 정보 컨테이너
따라서 입력으로 들어온 collision을 통해 상대방 게임 오브젝트, 충돌 지점, 충돌 표면의 방향 등을 알 수 있다.

  • OnCollisionEnter(Collision colllision) : 충돌한 순간
  • OnCollisionStay : 충돌하는 동안
  • OnCollisionExit : 충돌했다가 분리되는 순간

OnTrigger : 트리거 충돌

충돌한 두 게임 오브젝트의 콜라이더 중 최소 하나가 트리거 콜라이더면 자동 실행 충돌한 오브젝트는 서로 통과

  • OnTriggerEnter(Collider other) : 충돌 순간
  • OnTriggerStay : 충돌하는 동안
  • OnTriggerExit : 충돌했다가 분리되는 순간

충돌 정보 상세할 필요 없기에 Collision이 아닌 Collider타입을 사용

  • OnTrigger 계열의 메서드는 자신이 트리거 콜라이더가 아니어도 실행 된다
    • 충돌한 두 콜라이더 중 하나 이상이 트리거 콜라이더일 때 양쪽 모두에서 OnTrigger 계열의 메서드가 실행
    • OnCollision이 아닌 OnTrigger 메서드가 실행
void OnTriggerEnter(Collider other) {
	// 충돌한 상대방 게임 오브젝트가 Player 태그를 가진경우
    if(other.tag == "player")
    {
    	//상대방 게임 오브젝트에서 PlayerController 컴포넌트 가져오기
        PlayerController playerController = other.GetComponent<PlayerController>();
        
        //상대방으로부터 PlayerController 컴포넌트를 가져오는 데 성공했다면
        if(playerController != null)
        {
        	//상대방 playerController 컴포넌트의 Die()메서드 실행
            playerController.Die();
        }
  }

Random.Range()

float을 입력받을 때와 int를 입력받을 떄의 동작이 다르다

  • Random.Range(0,3) : 0,1,2중 하나가 int값으로 출력
  • Random.Range(0f,3f) : 0f와 3f사이값이 나온다

FindObjectType()

void Start(){
	// 최근 생성 이후의 누적 시간을 0으로 초기화
    timeAfterSpawn = 0f;
    // 탄알 생성 간격을 spawnRateMin과 spawnRateMax사이에서 랜덤 지정
    spawnRate = Random.Range(spawnRateMin, spawnRateMax);
    // playerController 컴포넌트를 가진 게임 오브젝트를 찾아 조준 대상으로 설정
    target = FindObjectOfType<PlayerController>().transform;
  • player 게임 오브젝트의 트랜스폼 컴포넌트를 찾아서 가져온다
  • 초기 비용이 크기 때문에 Start()메서드 처럼 초기에 한두번 실행되는 메서드에서만 사용

Time.deltaTime

  • Update() 실행 사이 시간 간격을 알기 위해 내장 변수 Time.deltaTime을 사용
  • 1초에 60프레임 속도로 화면을 갱신하는 컴에서는 1/60 1초에 120프레임 속도로 화면 갱신하는 컴은 1/120

Instantiate

Instantaite(원본, 위치, 회전);

  • transform.position : 자신의 위치
  • transform.rotation : 자신의 회전

주기적으로 탄알 생성

void Update()
{
	//timeAfterSpawn 갱신
    timeAfterSpawn += Time.deltaTime;
    
    //최근 생성 시점에서부터 누적된 시간이 생성 주기보다 크거나 같다면
    if(timeAfterSpawn >= spawnRate)
    {
    	// 누적된 시간을 리셋
        timeAfterSpawn = 0f;
        
        // bulletPrefab의 복제본을 
        // transform.position 위치와 transform.rotation 생성
        GameObject bullet 
        = Instatntiate(bulletPrefab, transform.position, transform.rotation);
        
        // 생성된 bullet 게임 오브젝트의 정면 방향이 target을 향하도록 회전
        bullet.transform.LookAt(target);
        
        // 다음번 생성 간격을 spawnRateMin, spawnRateMax사이에 랜덤 지정
        
profile
안녕하세요

0개의 댓글