이제민 강사님이 강의내용 공유해 주시는 사이트.
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); } } }