1. 적 구현하기
Copyright ⓒ 2014 Unity Technologies Korea All rights reserved. All contents cannot be copied without permission
중급
본 교재의 저작권은 유니티테크놀로지스코리아가 소유하고 있으며,
유니티 러닝센터 수강생맊 교재를 볼 수 있습니다. 정당한 권리 없이 저작물을 복제, 젂송할 경우
그로 인하여 발생하는 손해를 배상하여야 함을 유념하시기 바랍니다.
3. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
적 이동 로직 구현하기
[ MapManager ] 클래스를
싱글턴으로 맊들고
경로를 반환하는 함수를 제공
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.IO;
public class MapManager : MonoBehaviour
{
static MapManager _instance = null;
public static MapManager instance
{
get
{
return _instance;
}
}
void Awake()
{
_instance = this;
}
public Transform[] GetPathArray()
{
return _pathList.ToArray();
}
......
}
4. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
적 이동 로직 구현하기
using UnityEngine;
using System.Collections;
public class EnemyMove : MonoBehaviour
{
public Transform[] path = null;
public float moveSpeed = 1.0f;
public float rotationSpeed = 10.0f;
int currentPathIndex = 0;
Transform nextDestination = null;
void Start()
{
path =
MapManager.instance.GetPathArray();
FindNextDestination();
}
void FindNextDestination()
{
if (currentPathIndex < path.Length)
{
nextDestination = path[ currentPathIndex ];
if (currentPathIndex == 0)
transform.position = nextDestination.position;
++currentPathIndex;
}
else
{
Destroy( gameObject );
}
}
......
}
5. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
실제로 이동을
처리하는 방법 구현
(특정 거리 미맊으로
가까워지면 목적지를
변경하는 방식)
public class EnemyMove : MonoBehaviour
{
......
void Update()
{
if( nextDestination == null )
return;
Vector3 targetPos = nextDestination.position;
Vector3 myPos = transform.position;
myPos.y = targetPos.y = 0.0f;
float distance = (targetPos - myPos).magnitude;
if( distance < 0.1f )
{
FindNextDestination();
}
else
{
Vector3 dir = nextDestination.position - transform.position;
dir.y = 0.0f;
dir.Normalize();
transform.position += (dir * moveSpeed) * Time.deltaTime;
Quaternion from = transform.rotation;
Quaternion to = Quaternion.LookRotation(dir);
transform.rotation = Quaternion.Lerp( from, to, rotationSpeed * Time.deltaTime );
}
}
}
적 이동 로직 구현하기
6. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
맵을 자유롭게 편집하고 경로를 설정하고 구현
적 이동 로직 구현하기
7. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
맵을 반드시 저장 후 [ MapManager ] 의 [ Awake ] 함수 내에 다음과 같이 구현
적 이동 로직 구현하기
public class MapManager : MonoBehaviour
{
......
void Awake()
{
_instance = this;
LoadMapDataFromFile();
}
public Transform[] GetPathArray()
{
return _pathList.ToArray();
}
......
8. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
적 대싞 기본 큐브 생성
이름을 [ Enemy ] 로 설정
크기를( 0.5, 1.0, 1.0 )으로 설정
[EnemyMove] 스크립트 추가
적 이동 로직 구현하기
9. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
경로를 따라 이동하고 회젂하는 Enemy
적 이동 로직 구현하기
10. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
게임에 적용할 적 구현하기
BuzzerBot.fbx 메쉬 파일을 [Assets/Resources/Model/Enemy/BuzzerBot]에 추가
11. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
[ Plasma ] 마테리얼의 쉐이더는 [Mobile/Particles/Additive]로 설정, 텍스쳐는 [Plasma]
[ Buzzer ] 마테리얼의 쉐이더는 [Mobile/Diffuse]로 설정, 텍스쳐는 [Buzzer]
게임에 적용할 적 구현하기
12. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
BuzzerBot.fbx 선택후 인스펙터 뷰의 [ Scale Factor ] 을 1로 설정 하고
Rig 항목 내 Animation Type의 값을 None로 설정
게임에 적용할 적 구현하기
13. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
게임에 적용할 적 구현하기
BuzzerBot 오브젝트를 씬에 꺼낸 후 [ EnemyMove] 를 추가 후 실행
14. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
[Asset/Prefabs] 내에 [BuzzerBot] 오브젝트를 프리팹으로 맊들기
게임에 적용할 적 구현하기
15. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
게임에 적용할 적 구현하기
MineBot.fbx 메쉬 파일을 [Assets/Resources/Model/Enemy/MineBot] 추가
16. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
minebot_diffuse
마테리얼의 쉐이더를
[Mobile/Diffuse]로 설정,
텍스쳐는 [MineBot] 사용
게임에 적용할 적 구현하기
17. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
Minebot의 Scale Factor 는 0.01로 설정, Rig의 Animation Type을 [ Legacy ] 선택
게임에 적용할 적 구현하기
18. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
애니메이션 이름을 [ Walk ]로 설정
시작프레임은 0으로 설정
끝 프레임은 12로 설정
Wrap Mode 는 Loop로 설정
게임에 적용할 적 구현하기
19. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
MineBot도 BuzzerBot과 동일하게 경로를 따라 이동할 수 있도록 구현
빈 오브젝트를 생성후 이름을 [MineBot] 설정, 좌표와 회젂값은 (0, 0, 0), 크기는 ( 1, 1, 1)
게임에 적용할 적 구현하기
20. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
mineBot.fbx 를 씬에 꺼내고 이름을 [MineBot_Main]으로 변경 후 좌표 는( 0, 0, 0) 설정
게임에 적용할 적 구현하기
21. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
MineBot_Main 오브젝트를 MineBot의 자식으로 다음과 같이 구성
게임에 적용할 적 구현하기
22. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
[ EmemyMove ]스크립트가 애니메이션을 항상 재생하고 속도 조젃하는 기능 구현
using UnityEngine;
using System.Collections;
public class EnemyMove : MonoBehaviour
{
......
public Animation anim;
public float walkAnimationSpeed = 1.0f;
void Start()
{
path = MapManager.instance.GetPathArray();
FindNextDestination();
if( anim )
{
anim["Walk"].speed = walkAnimationSpeed;
anim.Play("Walk");
}
}
......
}
게임에 적용할 적 구현하기
23. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
인스펙터 뷰 에서 값 설정
게임에 적용할 적 구현하기
24. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
MineBot의 이동이 확인되면 오브젝트를 프리팹으로 [Assets/Prefabs]에 추가
게임에 적용할 적 구현하기
25. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
[Assets/Resources/Model/Enemy/MechBot]에 MechBot.fbx 추가
게임에 적용할 적 구현하기
26. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
MechBot.fbx 선택후 인스펙터 뷰에서 Scale Factor을 0.006으로 조젃
게임에 적용할 적 구현하기
27. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
MechBot 의 애니메이션은 Rig 설정 중 Animation Type를 [ Legacy ] 선택
게임에 적용할 적 구현하기
28. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
애니메이션 이름을 [Walk]로 설정
시작 프레임은 0으로 설정
끝 프레임은 40으로 설정
Wrap Mode는 Loop로 설정
게임에 적용할 적 구현하기
29. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
mech_patrolbot_diffuse
마테리얼의 쉐이더를
[Mobile/Diffuse]로 설정
게임에 적용할 적 구현하기
텍스쳐는
[MechPatrolbot]로 설정
30. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
MechBot 경로를 따라 이동할 수 있도록 빈 오브젝트[MechBot] 생성 후
좌표와 회젂값(0, 0, 0)으로 설정하고 크기 값은( 1, 1, 1)로 설정
게임에 적용할 적 구현하기
31. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
MechBot.fbx 를 씬에 꺼낸 후 오브젝트 이름을 [MechBot_Main] 로
변경 후 좌표는 (0, 0, 0)설정
게임에 적용할 적 구현하기
32. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
게임에 적용할 적 구현하기
[ MechBot_Main ] 오브젝트를 [ MechBot ] 자식 노드로 추가
33. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
[MechBot] 오브젝트에 [EnemyMove] 스크립트 연동, Anim은 [ MechBot_Main],
이동속도와 애니메이션 속도를 0.6으로 설정
게임에 적용할 적 구현하기
34. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
정상적인 움직임이 확인되면 [Assets/Prefabs] 폴더에 프리팹으로 설정
게임에 적용할 적 구현하기
35. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
마지막으로 [ MineBot ] 의 자식으로 구성
게임에 적용할 적 구현하기
36. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
적의 무리가 나오는 웨이브 매니저가 해야 할 기능들
웨이브 시스템 구현하기
웨이브 매니저의 역할
1. 웨이브 횟수를 관리한다.
2. 한번의 웨이브가 끝나고 다음 웨이브가 시작할 때까지
일정시갂의 대기 시갂을 가진다.
3. 각 웨이브에 따라 등장할 적을 관리한다.
4. 각 웨이브별로 적이 몇 마리나 등장할지 관리한다.
5. 각 웨이브별로 적이 몇 초마다 등장할지 관리한다.
37. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
구현하고자 하는 웨이브 매니저
인터페이스
웨이브 시스템 구현하기
38. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
[WaveManager] 스크립트를
[/Assets/Script/Wave] 폴더에 생성
웨이브 시스템 구현하기
[_WaveManager] 이름의
빈 오브젝트를 생성 후
[WaveManager] 스크립트를 추가
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
[System.Serializable]
public class Wave
{
public GameObject enemyPrefab = null;
public int spawnEnemyCount = 3;
public float spawnEnemyTime = 1.0f;
}
public class WaveManager : MonoBehaviour
{
public int _waveCount = 3;
public float _waveDelayTime = 3.0f;
public List<Wave> _waveList = new List<Wave>();
}
39. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
[WaveManagerInspector] 스크립트를 [Assets/Script/Editor] 폴더에 생성
웨이브 시스템 구현하기
using UnityEngine;
using UnityEditor;
using System.Collections;
[CustomEditor( typeof( WaveManager ) )]
public class WaveManagerInspector : Editor
{
public override void OnInspectorGUI()
{
WaveManager waveManager = target as WaveManager;
}
}
40. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
웨이브 횟수를 관리하는 웨이브 카운트와 웨이브 지연시간에 관련한 인터페이스 구성
웨이브 시스템 구현하기
......
[CustomEditor(typeof(WaveManager))]
public class WaveManagerInspector : Editor
{
public override void OnInspectorGUI()
{
WaveManager waveManager = target as WaveManager;
DrawWaveTime( waveManager );
}
void DrawWaveTime( WaveManager waveManager )
{
int waveCount = EditorGUILayout.IntField("Wave Count",
waveManager._waveCount);
if( waveManager._waveCount != waveCount )
{
CommonEditorUi.RegisterUndo("Wave Count", waveManager);
int gap = waveCount - waveManager._waveList.Count;
if (gap > 0)
{
for (int i = 0; i < gap; ++i)
{
waveManager._waveList.Add(new Wave());
}
}
else
{
waveManager._waveList.RemoveRange(waveCount, -gap);
}
waveManager._waveCount = waveManager._waveList.Count;
} // End of if( waveManager._waveCount != waveCount)
} // End of void DrawWaveTime( ......
}
41. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
기존 WaveList의 데이터를 유지하면서 WaveList의 끝 부분을 gap맊큼 제거
웨이브 시스템 구현하기
42. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
웨이브 지연시간과 관련한
인터페이스를 구현
웨이브 시스템 구현하기
[CustomEditor(typeof(WaveManager))]
public class WaveManagerInspector : Editor
{
public override void OnInspectorGUI()
{
WaveManager waveManager = target as WaveManager;
DrawWaveTime(waveManager);
CommonEditorUi.DrawSeparator( Color.cyan );
DrawWaveDelayTime( waveManager );
}
void DrawWaveDelayTime( WaveManager waveManager )
{
float waveDelayTime =
EditorGUILayout.FloatField( "Wave Delay Time",
waveManager._waveDelayTime );
if( waveDelayTime != waveManager._waveDelayTime )
{
CommonEditorUi.RegisterUndo( "Wave Delay time", waveManager );
waveManager._waveDelayTime = waveDelayTime;
}
}
}
43. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
웨이브 시스템 구현하기
bool fold = true;
void DrawWaveInfo( WaveManager waveManager )
{
fold = EditorGUILayout.Foldout(fold, "Wave List");
if (fold == false)
return;
for( int i = 0; i < waveManager._waveList.Count; ++i )
{
Wave wave = waveManager._waveList[i];
EditorGUILayout.LabelField("Wave : " + (i + 1));
GUI.color = (wave.enemyPrefab != null) ? Color.green : Color.red;
GameObject enemyPrefab =
(GameObject)EditorGUILayout.ObjectField("Enemy",
wave.enemyPrefab, typeof(GameObject), false);
if(enemyPrefab != wave.enemyPrefab )
{
CommonEditorUi.RegisterUndo("Enemy Prefab", waveManager);
wave.enemyPrefab = enemyPrefab;
}
GUI.color = Color.white;
int spawnEnemyCount = EditorGUILayout.IntField( "Spawn Enemy Count",
wave.spawnEnemyCount );
if( spawnEnemyCount != wave.spawnEnemyCount )
{
CommonEditorUi.RegisterUndo("Spawn Enemy Count",
waveManager);
wave.spawnEnemyCount = spawnEnemyCount;
}
float spawnEnemyTime =
EditorGUILayout.FloatField( "Spawn Enemy Time",
wave.spawnEnemyTime );
if( spawnEnemyTime != wave.spawnEnemyTime )
{
CommonEditorUi.RegisterUndo("Spawn Enemy Time",
waveManager);
wave.spawnEnemyTime = spawnEnemyTime;
}
CommonEditorUi.DrawSeparator(Color.cyan);
}
} // End of DrawWaveInfo ( WaveManagerInspector )
웨이브 입력 인터페이스 구현
44. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
웨이브 입력 인터페이스 구현
bool fold = true;
void DrawWaveInfo(WaveManager waveManager)
{
fold = EditorGUILayout.Foldout(fold, "Wave List");
if (fold == false)
return;
for( int i = 0; i < waveManager._waveList.Count; ++i )
{
Wave wave = waveManager._waveList[i];
EditorGUILayout.LabelField("Wave : " + (i + 1));
GUI.color = (wave.enemyPrefab != null) ? Color.green : Color.red;
GameObject enemyPrefab =
(GameObject)EditorGUILayout.ObjectField("Enemy",
wave.enemyPrefab, typeof(GameObject), false);
if(enemyPrefab != wave.enemyPrefab )
{
CommonEditorUi.RegisterUndo("Enemy Prefab", waveManager);
wave.enemyPrefab = enemyPrefab;
}
GUI.color = Color.white;
웨이브 시스템 구현하기
45. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
웨이브 입력 인터페이스 구현
웨이브 시스템 구현하기
int spawnEnemyCount = EditorGUILayout.IntField( "Spawn Enemy Count",
wave.spawnEnemyCount );
if( spawnEnemyCount != wave.spawnEnemyCount )
{
CommonEditorUi.RegisterUndo("Spawn Enemy Count",
waveManager);
wave.spawnEnemyCount = spawnEnemyCount;
}
float spawnEnemyTime =
EditorGUILayout.FloatField( "Spawn Enemy Time",
wave.spawnEnemyTime );
if( spawnEnemyTime != wave.spawnEnemyTime )
{
CommonEditorUi.RegisterUndo("Spawn Enemy Time",
waveManager);
wave.spawnEnemyTime = spawnEnemyTime;
}
CommonEditorUi.DrawSeparator(Color.cyan);
} // End of for( int i=0…
} // End of DrawWaveInfo ( WaveManagerInspector )
46. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
웨이브 입력 인터페이스 구현
웨이브 시스템 구현하기
[CustomEditor(typeof(WaveManager))]
public class WaveManagerInspector : Editor
{
public override void OnInspectorGUI()
{
WaveManager waveManager = target as WaveManager;
DrawWaveTime( waveManager );
CommonEditorUi.DrawSeparator( Color.cyan );
DrawWaveDelayTime( waveManager );
CommonEditorUi.DrawSeparator( Color.cyan );
DrawWaveInfo( waveManager );
}
......
47. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
웨이브를 실제로 가동하는 로직은 [WaveManager]에 구현
웨이브 시스템 구현하기
......
public class WaveManager : MonoBehaviour
{
......
int _currentWaveIndex = 0;
bool _waveProgress = false;
void Update()
{
if( _waveProgress == false )
{
if( _currentWaveIndex < _waveList.Count )
{
Wave wave = _waveList[ _currentWaveIndex ];
StartCoroutine( WaveProcess(wave) );
++_currentWaveIndex;
}
}
}
IEnumerator WaveProcess( Wave wave )
{
_waveProgress = true;
for( int i = 0; i < wave.spawnEnemyCount; ++i )
{
GameObject enemy =
Instantiate( wave.enemyPrefab ) as GameObject;
yield return new WaitForSeconds( wave.spawnEnemyTime );
}
yield return new WaitForSeconds( _waveDelayTime );
_waveProgress = false;
}
}
48. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
WaveManager 설정에 따라 적이 생성되는 모습
웨이브 시스템 구현하기
49. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
씬에 빈 게임오브젝트 생성후 [BuzzerBot]으로 설정 후 좌표값은 (0, 0, 0) 설정
씬에 BuzzerBot 프리팹을 꺼내고 [BuzzerBot_Main] 으로
이름 설정 후 좌표를(0, 1, 0) 설정
회젂은 (0, 0, 0) 설정후 [BuzzerBot_Main] 을 [BuzzerBot] 자식노드로 추가
웨이브 시스템 구현하기
50. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
[BuzzerBot_Main] 에 붙은 [EnemyMove] 스크립트 제거 후
[BuzzerBot] 에 [EnemyMove] 스크립트 추가
웨이브 시스템 구현하기
51. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
씬에 있는 [BuzzerBot] 프리팹을 [Assets/Prefabs/Enemy] 폴더의
[BuzzerBot] 프리팹에 덮어 씌움
웨이브 시스템 구현하기
52. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
경고 메시지가 나오지맊 [Replace anyway] 버튺 클릭
웨이브 시스템 구현하기