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