Unity basic parts (3) – 3D 총알피하기 게임 만들기(2)

이제민 강사님이 강의내용 공유해 주시는 사이트.
boxcollider.io

Unity Project : 폴더기반으로 하나의 프로젝트가 관리되며, 관리되는 폴더는[Assets,Packages,ProjectSettings] 가 있다.

[Collider].Is Trigger : 충돌 감지여부
– Checked : 총알끼리는 부딪히지 않아야 한다. 기본적으로 뚫고 지나가야함.
충돌감지, 상대방을 밀어내지는 않지만 충돌감지는 한다.
물리적인 반발력은 필요하지 않을때 사용한다.

유니티의 메세지 기반 함수들. Start(), Update(), …

OnTriggerEnter(상대방 콜라이더) 둘 중 하나라도 Rigidbody를 가지고 있다면 메세지를 Broadcasting.

유니티 개발자는 충돌 그자체를 구현하기보다 출동을 감지했을때 무엇을 할까에 집중한다.

Rigidbody : 게임오브젝트에 물리영향을 받을 수 있게끔 한다.

FindObjectOfType() : 많이 쓰면 안됨. Scene 에 존재하는 모든 게임오브젝트를 검색하기 때문.

Time.deltaTime : 직전의 Update()가 호출된 시간으로부터의 흐른 시간. 시간간격

UI (2D)도 게임 오브젝트이다.
EventSystem : 사용자가 입력을 가했을때, 그 입력을 당했을때 그것을 알려주는 역할을 한다.
알아서 동작함. UI요소들에게 입력을 당했을때 알려준다.

Canvas: 모든 UI요소(2D)들의 부모이다.

Rect Transform, Anchor Presets 를 눌러 설정할때 Alt 를 눌러 기준점과 함께 위치를 변경한다.

글상자보다 글자가 커서 안보일때, Alignment : middle, center,
Horizontal Overflow : overflow, Vertical Overflow : overflow (/wrap:자르기)
잘안보이면, shadow 또는 outline component를 적용
Add Component, UI, effects

Prefab : Bullet를 Assets로 드래그&드랍하면 Prefab 형식으로되며, 재사용 가능하다.

[Canvas].Scaler
UI Scale Mode : 기준해상도를 설정. Scale With Screen Size, Constant Pixel Size, Constant Physical Size
Match : Width;가로는 짤릴수 있고 세로는 안짤린다.

// 현재 Scene에 존재하는 모든 게임 오브젝트를 파괴하고, 새로운 Scene를 로딩한다.
string sceneName = "SampleScene";
SceneManager.LoadScene(sceneName);

PlayerPrefs : 사용자 설정을 K,V 형태로 로컬 파일에 저장된다. 키가 없으면 Type의 기본값을 반환한다. 보안은 약하다. 해킹에 위험이 있다.

Dodge 게임 소스
https://github.com/reastykim/SVVR-Dodge

public class Bullet : MonoBehaviour {
    public float speed = 8f; // 총알 이동 속도
    // 이동에 사용할 리지드바디 컴포넌트
    private Rigidbody bulletRigidbody;

	void Start () {
        // 자신의 게임 오브젝트에서 Rigidbody를 찾아가져오기
        bulletRigidbody = GetComponent<Rigidbody>();

        // 리지드바디의 속도 = 앞쪽 방향 * 속력
        // transform은 자신의 트랜스폼 컴포넌트를 즉시
        // 접근하는 지름길
        bulletRigidbody.velocity
            = transform.forward * speed;

        // 자신의 게임 오브젝트를 3초 뒤에 파괴
        Destroy(gameObject, 3f);
	}

    // 트리거 충돌 : 서로 뚫고 지나가는 충돌
    // 트리거 충돌시 자동실행 (입력으로 상대방 콜라이더가 옴)
    private void OnTriggerEnter(Collider other)
    {
        // 충돌한 상대방의 태그가 Player 인가?
        if(other.gameObject.tag == "Player")
        {
            // 그러하다면, 상대방으로부터
            // PlayerController 컴포넌트를 가져오기
            PlayerController playerController
                = other.GetComponent<PlayerController>();
            // 플레이어 사망 실행
            playerController.Die();
        }
    }

    // 일반 충돌시 자동실행
    //private void OnCollisionEnter(Collision collision)
    //{
        
    //}
}
public class BulletSpawner : MonoBehaviour {
    public GameObject bulletPrefab; // 생성할 총알 원본 프리팹
    public float spawnRateMin = 0.5f; // 최소 생성 주기
    public float spawnRateMax = 3f; // 최대 생성 주기

    private Transform target; // 발사할 대상
    private float spawnRate; // 생성 주기
    private float timeAfterSpawn; // 최근 생성 시점에서 지난 시간

    void Start () {
        timeAfterSpawn = 0f; // 타이머를 리셋
        // spawnRateMin과 spawnRateMax 사이의 랜던 값을 사용
        spawnRate = Random.Range(spawnRateMin,spawnRateMax);
        // FindObjectOfType은 씬에 존재하는 모든 오브젝트를 검색
        // 하여 원하는 타입의 오브젝트를 찾아옴
        target = FindObjectOfType<PlayerController>().transform;

        //PlayerController playerController
        //    = FindObjectOfType<PlayerController>();
        //target = playerController.transform;
	}

    // 1/60초 마다 실행됨
    // 1회 실행 마다 : timeAfterSpawn = timeAfterSpawn + 1/60
    // 100번 실행 -> 현실시간으로는 100/60초, timeAfterSpawn = 100/60

    // 게임 화면이 한번 갱신될때 한번 실행됨
	void Update () {

        // Time.deltaTime은 직전의 Update와 현재 Update 실행 시점
        // 사이의 시간 간격
        timeAfterSpawn = timeAfterSpawn + Time.deltaTime;
        // 누적된 시간이 생성 주기보다 크거나 같다
        if(timeAfterSpawn >= spawnRate)
        {
            timeAfterSpawn = 0f; // 누적된 시간을 리셋

            // bulletPrefab의 복제본을 생성
            // 위치와 회전은 총알 생성기 자신의 위치와 회전으로 지정.
            // 생성된 총알 복제본을 bullet 이라는 변수로 다루기
            GameObject bullet = Instantiate(bulletPrefab,
                transform.position,transform.rotation);

            // 총알이 target을 바라보도록 회전
            bullet.transform.LookAt(target);

            // 다음번 생성까지의 생성 간격을 랜덤하게 변경
            spawnRate = Random.Range(spawnRateMin, spawnRateMax);
        }
	}
}

 

 

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다