총알 아이템
using UnityEngine;
// 총알을 충전하는 아이템
public class AmmoPack : MonoBehaviour, IItem {
public int ammo = 30; // 충전할 총알 수
public void Use(GameObject target) {
// 전달 받은 게임 오브젝트로부터 PlayerShooter 컴포넌트를 가져오기 시도
PlayerShooter playerShooter = target.GetComponent<PlayerShooter>();
// PlayerShooter 컴포넌트가 있으며, 총 오브젝트가 존재하면
if (playerShooter != null && playerShooter.gun != null)
{
// 총의 남은 탄환 수를 ammo 만큼 더한다
playerShooter.gun.ammoRemain += ammo;
}
// 사용되었으므로, 자신을 파괴
Destroy(gameObject);
}
}
체력 아이템
using UnityEngine;
// 체력을 회복하는 아이템
public class HealthPack : MonoBehaviour, IItem {
public float health = 50; // 체력을 회복할 수치
public void Use(GameObject target) {
// 전달받은 게임 오브젝트로부터 LivingEntity 컴포넌트 가져오기 시도
LivingEntity life = target.GetComponent<LivingEntity>();
// LivingEntity컴포넌트가 있다면
if (life != null)
{
// 체력 회복 실행
life.RestoreHealth(health);
}
// 사용되었으므로, 자신을 파괴
Destroy(gameObject);
}
}
점수 획득
using UnityEngine;
// 게임 점수를 증가시키는 아이템
public class Coin : MonoBehaviour, IItem {
public int score = 200; // 증가할 점수
public void Use(GameObject target) {
// 게임 매니저로 접근해 점수 추가
GameManager.instance.AddScore(score);
// 사용되었으므로, 자신을 파괴
Destroy(gameObject);
}
}
아이템 생성
using UnityEngine;
using UnityEngine.AI; // 내비메쉬 관련 코드
// 주기적으로 아이템을 플레이어 근처에 생성하는 스크립트
public class ItemSpawner : MonoBehaviour {
public GameObject[] items; // 생성할 아이템들
public Transform playerTransform; // 플레이어의 트랜스폼
public float maxDistance = 5f; // 플레이어 위치로부터 아이템이 배치될 최대 반경
public float timeBetSpawnMax = 7f; // 최대 시간 간격
public float timeBetSpawnMin = 2f; // 최소 시간 간격
private float timeBetSpawn; // 생성 간격
private float lastSpawnTime; // 마지막 생성 시점
private void Start() {
// 생성 간격과 마지막 생성 시점 초기화
timeBetSpawn = Random.Range(timeBetSpawnMin, timeBetSpawnMax);
lastSpawnTime = 0;
}
// 주기적으로 아이템 생성 처리 실행
private void Update() {
// 현재 시점이 마지막 생성 시점에서 생성 주기 이상 지남
// && 플레이어 캐릭터가 존재함
if (Time.time >= lastSpawnTime + timeBetSpawn && playerTransform != null)
{
// 마지막 생성 시간 갱신
lastSpawnTime = Time.time;
// 생성 주기를 랜덤으로 변경
timeBetSpawn = Random.Range(timeBetSpawnMin, timeBetSpawnMax);
// 아이템 생성 실행
Spawn();
}
}
// 실제 아이템 생성 처리
private void Spawn() {
// 플레이어 근처에서 내비메시 위의 랜덤 위치 가져오기
Vector3 spawnPosition =
GetRandomPointOnNavMesh(playerTransform.position, maxDistance);
// 바닥에서 0.5만큼 위로 올리기
spawnPosition += Vector3.up * 0.5f;
// 아이템 중 하나를 무작위로 골라 랜덤 위치에 생성
GameObject selectedItem = items[Random.Range(0, items.Length)];
GameObject item = Instantiate(selectedItem, spawnPosition, Quaternion.identity);
// 생성된 아이템을 5초 뒤에 파괴
Destroy(item, 5f);
}
// 내비메시 위의 랜덤한 위치를 반환하는 메서드
// center를 중심으로 distance 반경 안에서 랜덤한 위치를 찾는다
private Vector3 GetRandomPointOnNavMesh(Vector3 center, float distance) {
// center를 중심으로 반지름이 maxDistance인 구 안에서의 랜덤한 위치 하나를 저장
// Random.insideUnitSphere는 반지름이 1인 구 안에서의 랜덤한 한 점을 반환하는 프로퍼티
Vector3 randomPos = Random.insideUnitSphere * distance + center;
// 내비메시 샘플링의 결과 정보를 저장하는 변수
NavMeshHit hit;
// maxDistance 반경 안에서, randomPos에 가장 가까운 내비메시 위의 한 점을 찾음
NavMesh.SamplePosition(randomPos, out hit, distance, NavMesh.AllAreas);
// 찾은 점 반환
return hit.position;
}
}
'게임개발 > 게임플랫폼 응용 프로그래밍' 카테고리의 다른 글
좀비 서바이버 (6) 좀비 생성 (0) | 2024.03.11 |
---|---|
좀비 서바이버 (5) 게임 상태 표시 UI만들기 (0) | 2024.03.11 |
데미지 텍스트 만들기 2 : DoTween으로 만들기 (0) | 2024.03.11 |
데미지 텍스트 만들기 1 : 애니메이션으로 만들기 (0) | 2024.03.11 |
UI카메라를 사용할 때 UI위치 변환 (0) | 2024.03.11 |