2025유니티수업
0708 유니티(좀비 서바이벌 완성 , scope zoom)
버스창문
2025. 7. 8. 15:14
UIManager
public static UIManager Instance
{
get
{
if (_instance == null)
{
_instance = FindObjectOfType<UIManager>(); // 해당 씬에 있는 UIManager를 찾음
}
return _instance;
}
} // 싱글톤 인스턴스
private static UIManager _instance; // 싱글톤 인스턴스 변수
프로퍼티를 사용해서 좀 더 깔끔하게 만드는 모습
public class ZombieSpawner : MonoBehaviour
{
public GameObject zombiePrefab;
public ZombieData[] zombieDatas; // 좀비 데이터 배열
public Transform[] spawnPoints; // 좀비가 생성될 위치
private List<Zombie> zombiePool = new List<Zombie>(); // 생성된 좀비 풀링
private List<Zombie> zombies = new List<Zombie>(); // 생성된 좀비 목록
private int wave; // 현재 웨이브
private void Start()
{
this.zombieDatas = Resources.LoadAll<ZombieData>("Scriptable"); // Resources 폴더에서 좀비 데이터 로드
}
void Update()
{
if (GameManager.Instance != null && GameManager.Instance.IsGameOver) return;
if (zombies.Count <= 0)
{
SpawnWave();
}
}
private void UpdateUI()
{
if (GameManager.Instance != null && UIManager.Instance != null)
{
UIManager.Instance.UpdateWaveTxt(wave,this.zombies.Count);
}
}
private void SpawnWave() // 웨이브 시작
{
wave++;
int zombieCount = Mathf.RoundToInt(wave * 1.5f); // 웨이브마다 좀비 수 증가
for (int i = 0; i < zombieCount; i++)
{
CreateZombie();
}
UpdateUI(); // UI 업데이트
}
private void CreateZombie()
{
ZombieData data = zombieDatas[UnityEngine.Random.Range(0, zombieDatas.Length)]; // 랜덤으로 좀비 데이터 선택
Transform spawnPoint = spawnPoints[UnityEngine.Random.Range(0, spawnPoints.Length)]; // 랜덤으로 생성 위치 선택
for(int i = 0; i<this.zombiePool.Count; i++)
{
if (!zombiePool[i].gameObject.activeSelf)
{
zombiePool[i].transform.position = spawnPoint.position; // 생성 위치로 이동
zombiePool[i].Setup(data); // 좀비 데이터 설정
this.zombies.Add(zombiePool[i]); // 생성된 좀비 목록에 추가
zombiePool[i].gameObject.SetActive(true); // 비활성화된 좀비가 있다면 활성화
return;
}
}
//여기로 왔으면 모든게 활성화 되어있거나, 생성된게 없거나
Zombie zombie = Instantiate(zombiePrefab, spawnPoint.position, Quaternion.identity).GetComponent<Zombie>(); // 좀비 생성
zombie.Setup(data); // 좀비 데이터 설정
zombie.DieAction += () =>
{
this.zombies.Remove(zombie); // 좀비가 죽으면 목록에서 제거
//목록에서만 제거
UpdateUI(); // UI 업데이트
GameManager.Instance.AddScore(100); // 점수 업데이트
};
this.zombiePool.Add(zombie); // 생성된 좀비 풀링에 추가
this.zombies.Add(zombie); // 생성된 좀비 목록에 추가
}
}
오브젝트 풀링을 활용한 좀비 스폰
Post Processing
후처리, 영상미를 추가하는것

적용되는 과정은
카메라의 필터와 비슷하다
처음 그려지는 주요과정에서 적용되는것이 아닌, 마지막에 적용된다

Use Graphics Settings : 프로젝트 설정에 맞춰서 자동으로 렌더링한다.
설정된 디폴트값대로 한다.
성능이 가볍고, 라이팅 표현이 실제 보다 간략하게 되어있다.
Deferred : 라이팅 연산을 미루어서 실행하는 방식
첫번째 경로 에는 매쉬를 그리되, 라이팅을 계산하거나 색을 채우지 않는다 (처음엔 대충 그린다)
대신 버퍼에 할당한다 (나중에 해야지 해놓는다)
두번째 경로에는 첫번쨰 경로에서 그린걸 활용해 라이팅을 그리고, 최종 컬러를 결정한다.(밑그림 기반으로 완성)

deffered에서는 MSAA(안티 엘리어싱의 한종류) 를 제대로 지원하지 않는다


따로 레이어 추가해야 한다





_______________________________________________________________________________

zoom할때 렌즈는 밝게 보이고, 나머진 안보이거나 흐리게 보이는 효과를 연출하는 스크립트


가까이 있으면 뚫고 보이게 하는 수치
저기 적은 수치보다 가까우면 뚫고 보인다
0.1로 해놔야 스코프로 볼수있다