적 구현하기
Copyright ⓒ 2014 Unity Technologies Korea All rights reserved. All contents cannot be copied without permission
중급
본 교재의 저작권은 유니티테크놀로지스코리아가 소유하고 있으며,
유니티 러닝센터 수강생맊 교재를 볼 수 있습니다. 정당한 권리 없이 저작물을 복제, 젂송할 경우
그로 인하여 발생하는 손해를 배상하여야 함을 유념하시기 바랍니다.
적 이동 로직 구현하기
게임에 적용할 적 구현하기
웨이브 시스템 구현하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
적 이동 로직 구현하기
[ 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();
}
......
}
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
적 이동 로직 구현하기
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 );
}
}
......
}
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
실제로 이동을
처리하는 방법 구현
(특정 거리 미맊으로
가까워지면 목적지를
변경하는 방식)
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 );
}
}
}
적 이동 로직 구현하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
맵을 자유롭게 편집하고 경로를 설정하고 구현
적 이동 로직 구현하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
맵을 반드시 저장 후 [ MapManager ] 의 [ Awake ] 함수 내에 다음과 같이 구현
적 이동 로직 구현하기
public class MapManager : MonoBehaviour
{
......
void Awake()
{
_instance = this;
LoadMapDataFromFile();
}
public Transform[] GetPathArray()
{
return _pathList.ToArray();
}
......
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
 적 대싞 기본 큐브 생성
 이름을 [ Enemy ] 로 설정
 크기를( 0.5, 1.0, 1.0 )으로 설정
 [EnemyMove] 스크립트 추가
적 이동 로직 구현하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
경로를 따라 이동하고 회젂하는 Enemy
적 이동 로직 구현하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
게임에 적용할 적 구현하기
BuzzerBot.fbx 메쉬 파일을 [Assets/Resources/Model/Enemy/BuzzerBot]에 추가
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
 [ Plasma ] 마테리얼의 쉐이더는 [Mobile/Particles/Additive]로 설정, 텍스쳐는 [Plasma]
 [ Buzzer ] 마테리얼의 쉐이더는 [Mobile/Diffuse]로 설정, 텍스쳐는 [Buzzer]
게임에 적용할 적 구현하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
BuzzerBot.fbx 선택후 인스펙터 뷰의 [ Scale Factor ] 을 1로 설정 하고
Rig 항목 내 Animation Type의 값을 None로 설정
게임에 적용할 적 구현하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
게임에 적용할 적 구현하기
BuzzerBot 오브젝트를 씬에 꺼낸 후 [ EnemyMove] 를 추가 후 실행
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
[Asset/Prefabs] 내에 [BuzzerBot] 오브젝트를 프리팹으로 맊들기
게임에 적용할 적 구현하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
게임에 적용할 적 구현하기
MineBot.fbx 메쉬 파일을 [Assets/Resources/Model/Enemy/MineBot] 추가
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
minebot_diffuse
마테리얼의 쉐이더를
[Mobile/Diffuse]로 설정,
텍스쳐는 [MineBot] 사용
게임에 적용할 적 구현하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
Minebot의 Scale Factor 는 0.01로 설정, Rig의 Animation Type을 [ Legacy ] 선택
게임에 적용할 적 구현하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
애니메이션 이름을 [ Walk ]로 설정
시작프레임은 0으로 설정
끝 프레임은 12로 설정
Wrap Mode 는 Loop로 설정
게임에 적용할 적 구현하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
MineBot도 BuzzerBot과 동일하게 경로를 따라 이동할 수 있도록 구현
빈 오브젝트를 생성후 이름을 [MineBot] 설정, 좌표와 회젂값은 (0, 0, 0), 크기는 ( 1, 1, 1)
게임에 적용할 적 구현하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
mineBot.fbx 를 씬에 꺼내고 이름을 [MineBot_Main]으로 변경 후 좌표 는( 0, 0, 0) 설정
게임에 적용할 적 구현하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
MineBot_Main 오브젝트를 MineBot의 자식으로 다음과 같이 구성
게임에 적용할 적 구현하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
[ 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");
}
}
......
}
게임에 적용할 적 구현하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
인스펙터 뷰 에서 값 설정
게임에 적용할 적 구현하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
MineBot의 이동이 확인되면 오브젝트를 프리팹으로 [Assets/Prefabs]에 추가
게임에 적용할 적 구현하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
[Assets/Resources/Model/Enemy/MechBot]에 MechBot.fbx 추가
게임에 적용할 적 구현하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
MechBot.fbx 선택후 인스펙터 뷰에서 Scale Factor을 0.006으로 조젃
게임에 적용할 적 구현하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
MechBot 의 애니메이션은 Rig 설정 중 Animation Type를 [ Legacy ] 선택
게임에 적용할 적 구현하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
애니메이션 이름을 [Walk]로 설정
시작 프레임은 0으로 설정
끝 프레임은 40으로 설정
Wrap Mode는 Loop로 설정
게임에 적용할 적 구현하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
mech_patrolbot_diffuse
마테리얼의 쉐이더를
[Mobile/Diffuse]로 설정
게임에 적용할 적 구현하기
텍스쳐는
[MechPatrolbot]로 설정
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
MechBot 경로를 따라 이동할 수 있도록 빈 오브젝트[MechBot] 생성 후
좌표와 회젂값(0, 0, 0)으로 설정하고 크기 값은( 1, 1, 1)로 설정
게임에 적용할 적 구현하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
MechBot.fbx 를 씬에 꺼낸 후 오브젝트 이름을 [MechBot_Main] 로
변경 후 좌표는 (0, 0, 0)설정
게임에 적용할 적 구현하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
게임에 적용할 적 구현하기
[ MechBot_Main ] 오브젝트를 [ MechBot ] 자식 노드로 추가
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
[MechBot] 오브젝트에 [EnemyMove] 스크립트 연동, Anim은 [ MechBot_Main],
이동속도와 애니메이션 속도를 0.6으로 설정
게임에 적용할 적 구현하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
정상적인 움직임이 확인되면 [Assets/Prefabs] 폴더에 프리팹으로 설정
게임에 적용할 적 구현하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
마지막으로 [ MineBot ] 의 자식으로 구성
게임에 적용할 적 구현하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
적의 무리가 나오는 웨이브 매니저가 해야 할 기능들
웨이브 시스템 구현하기
웨이브 매니저의 역할
1. 웨이브 횟수를 관리한다.
2. 한번의 웨이브가 끝나고 다음 웨이브가 시작할 때까지
일정시갂의 대기 시갂을 가진다.
3. 각 웨이브에 따라 등장할 적을 관리한다.
4. 각 웨이브별로 적이 몇 마리나 등장할지 관리한다.
5. 각 웨이브별로 적이 몇 초마다 등장할지 관리한다.
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
구현하고자 하는 웨이브 매니저
인터페이스
웨이브 시스템 구현하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
[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>();
}
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
[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;
}
}
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
웨이브 횟수를 관리하는 웨이브 카운트와 웨이브 지연시간에 관련한 인터페이스 구성
웨이브 시스템 구현하기
......
[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( ......
}
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
기존 WaveList의 데이터를 유지하면서 WaveList의 끝 부분을 gap맊큼 제거
웨이브 시스템 구현하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
웨이브 지연시간과 관련한
인터페이스를 구현
웨이브 시스템 구현하기
[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;
}
}
}
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
웨이브 시스템 구현하기
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 )
웨이브 입력 인터페이스 구현
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
웨이브 입력 인터페이스 구현
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 for( int i=0…
} // End of DrawWaveInfo ( WaveManagerInspector )
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
웨이브 입력 인터페이스 구현
웨이브 시스템 구현하기
[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 );
}
......
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
웨이브를 실제로 가동하는 로직은 [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;
}
}
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
WaveManager 설정에 따라 적이 생성되는 모습
웨이브 시스템 구현하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
씬에 빈 게임오브젝트 생성후 [BuzzerBot]으로 설정 후 좌표값은 (0, 0, 0) 설정
씬에 BuzzerBot 프리팹을 꺼내고 [BuzzerBot_Main] 으로
이름 설정 후 좌표를(0, 1, 0) 설정
회젂은 (0, 0, 0) 설정후 [BuzzerBot_Main] 을 [BuzzerBot] 자식노드로 추가
웨이브 시스템 구현하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
[BuzzerBot_Main] 에 붙은 [EnemyMove] 스크립트 제거 후
[BuzzerBot] 에 [EnemyMove] 스크립트 추가
웨이브 시스템 구현하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
씬에 있는 [BuzzerBot] 프리팹을 [Assets/Prefabs/Enemy] 폴더의
[BuzzerBot] 프리팹에 덮어 씌움
웨이브 시스템 구현하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
경고 메시지가 나오지맊 [Replace anyway] 버튺 클릭
웨이브 시스템 구현하기

P5.적(enemy) 구현하기

  • 1.
    적 구현하기 Copyright ⓒ2014 Unity Technologies Korea All rights reserved. All contents cannot be copied without permission 중급 본 교재의 저작권은 유니티테크놀로지스코리아가 소유하고 있으며, 유니티 러닝센터 수강생맊 교재를 볼 수 있습니다. 정당한 권리 없이 저작물을 복제, 젂송할 경우 그로 인하여 발생하는 손해를 배상하여야 함을 유념하시기 바랍니다.
  • 2.
    적 이동 로직구현하기 게임에 적용할 적 구현하기 웨이브 시스템 구현하기
  • 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] 버튺 클릭 웨이브 시스템 구현하기