일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- Addressable System
- 게임 개발
- Android Plugin
- design pattern
- Unboxing
- Zenject
- Unity
- 포스트 프로세싱
- Post Processing
- equals
- Strategy Pattern
- 플러그인
- sprite atlas
- 인앱 결제
- addressable
- Reflection
- ==
- ScriptableObject
- UniRx
- Abstract Factory Pattern
- Boxing
- c#
- 스프라이트 아틀라스
- 디자인 패턴
- 1인 개발
- ReferenceEquals
- 최적화
- Today
- Total
One_KWS
게임 개발 일지 #8 - 몬스터 생성 본문
Spawn Object
게임이 시작했을 때 또는 다음 층으로 넘어갔을 때 몬스터를 생성해주는 기능을 추가했다. 그냥 생성해주면 밋밋하니 몬스터 생성 효과를 넣기로 했다. 가지고 있던 이펙트 에셋을 조금 수정해서 아래와 같이 만들었다.
EnemySpawn
GameObject를 하나 생성하여 만든 이펙트를 자식으로 넣어주고 EnemySpawn 스크립트를 생성해서 붙여주었다. 스크립트에는 아래와 같이 구현했다.
public class EnemySpawn : MonoBehaviour {
public Action<GameObject> OnEnemyCreated;
[SerializeField] private ParticleSystem spawnEffect;
[SerializeField] private int spawnDelay = 500;
public async UniTaskVoid SpawnEnemy(GameObject enemy, Transform enemyParent) {
spawnEffect.Play();
await UniTask.Delay(spawnDelay);
var enemyObject = Instantiate(enemy, transform.position, Quaternion.identity, enemyParent);
OnEnemyCreated?.Invoke(enemyObject);
Destroy(gameObject, 1f);
}
}
SpawnEnemy 함수를 이용하여 몬스터 GameObject를 받아서 생성해주도록 했다.
GameManager
만든 오브젝트를 프리팹으로 만들어주고 GameManager에서 생성하도록 구현했다. 생성되는 몬스터의 수는 랜덤하게 결정되도록 Random.Range를 이용했다. 생성될 몬스터도 랜덤으로 결정되도록 for문을 돌때 0과 몬스터 List의 Count 사이의 값을 받아 해당 값을 List의 Index로 사용하여 랜덤한 몬스터가 생성되도록 했다.
[SerializeField] private List<GameObject> enemies = new List<GameObject>();
[SerializeField] private GameObject enemySpawnPoint;
...
private async UniTaskVoid StartGame() {
await UniTask.Delay(1000); //시작하자마자 바로 생성하는게 아니라 조금 후에 생성하도록 기다린다.
CreateEnemies();
}
...
private void CreateEnemies() {
var enemyCount = Random.Range(5, 10);
for (int i = 0; i < enemyCount; i++) {
var spawnPosition = GetRandomSpawnPosition();
var enemySpawn = Instantiate(enemySpawnPoint, spawnPosition, Quaternion.identity).GetComponent<EnemySpawn>();
enemySpawn.OnEnemyCreated = OnEnemyCreated;
var randomEnemyIndex = Random.Range(0, enemies.Count);
enemySpawn.SpawnEnemy(enemies[randomEnemyIndex], enemyParent).Forget();
}
}
생성되는 몬스터의 위치 또한 랜덤으로 결정해주었다. 맵 크기 안쪽의 Position 값을 리턴하는 GetRandomSpawnPosition 함수를 만들어 몬스터 생성시 랜덤 위치 값을 넣어주도록 했다.
...
private const float SPAWN_POSITION_X_END = 38f;
private const float SPAWN_POSITION_Y_END = 26f;
private const float SPAWN_POSITION_START = 2f;
...
private static Vector3 GetRandomSpawnPosition() {
var randomX = Random.Range(SPAWN_POSITION_START, SPAWN_POSITION_X_END) * Vector3.right;
var randomZ = Random.Range(SPAWN_POSITION_START, SPAWN_POSITION_Y_END) * Vector3.forward;
return randomX + randomZ;
}
결과
게임 시작시 숫자, 종류, 위치가 랜덤하게 생성된다.
GameManager와 SpawnEnemy에서 매번 Instantiate와 Destroy를 하고 있는데 메모리에 좋지 않으니 나중에 풀링 방식으로 수정해야겠다.
사용 에셋
Character
POLYGON Modular Fantasy Hero Characters (Synty Studios)
POLYGON Fantasy Rivals (Synty Studios)
Animation
Oriental Sword AnimSet (wemakethegame)
DOTween (Demigiant)
VFX
Magic Arsenal (Magic Arsenal)
UI
GUI PRO Kit - Fantasy RPG (Layer Lab)
ETC
UniTask (neuecc - Yoshifumi Kawai)
'게임 개발' 카테고리의 다른 글
게임 개발 일지 #10 - 게임 개선 (0) | 2023.03.11 |
---|---|
게임 개발 일지 #9 - 아이템 (0) | 2023.03.07 |
게임 개발 일지 #7 - 데미지 표시 (0) | 2023.02.12 |
게임 개발 일지 #6 - 플레이어 공격 개선 (0) | 2023.02.08 |
게임 개발 일지 #5 - 몬스터 공격, 이동 (0) | 2023.01.26 |