SlideShare a Scribd company logo
1 of 52
적 구현하기
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] 버튺 클릭
웨이브 시스템 구현하기

More Related Content

Viewers also liked

Port polio게임 소개
Port polio게임 소개Port polio게임 소개
Port polio게임 소개Seo YoungHoon
 
디자이너를 위한 NGUI의 이해
디자이너를 위한 NGUI의 이해디자이너를 위한 NGUI의 이해
디자이너를 위한 NGUI의 이해Je Lyoung Kim
 
VR 슈팅 액션 게임 개발 노트(오답노트) V 0.2
VR 슈팅 액션 게임 개발 노트(오답노트) V 0.2VR 슈팅 액션 게임 개발 노트(오답노트) V 0.2
VR 슈팅 액션 게임 개발 노트(오답노트) V 0.2Jong Won Park
 
20140929 vr for_slideshare
20140929 vr for_slideshare20140929 vr for_slideshare
20140929 vr for_slideshareSunghyeon Hwang
 
[IGC 2016] 이장주 소장 - 재미의 심리학: 게이머가 느끼는 재미를 중심으로
[IGC 2016] 이장주 소장 - 재미의 심리학: 게이머가 느끼는 재미를 중심으로 [IGC 2016] 이장주 소장 - 재미의 심리학: 게이머가 느끼는 재미를 중심으로
[IGC 2016] 이장주 소장 - 재미의 심리학: 게이머가 느끼는 재미를 중심으로 강 민우
 
[IGC 2016] 골드로쉬 김현석 - 왜 항상 기획자는 욕을 들어야만 하는 걸까? –게임 기획의 포지션 변화-
[IGC 2016] 골드로쉬 김현석 - 왜 항상 기획자는 욕을 들어야만 하는 걸까? –게임 기획의 포지션 변화-[IGC 2016] 골드로쉬 김현석 - 왜 항상 기획자는 욕을 들어야만 하는 걸까? –게임 기획의 포지션 변화-
[IGC 2016] 골드로쉬 김현석 - 왜 항상 기획자는 욕을 들어야만 하는 걸까? –게임 기획의 포지션 변화-강 민우
 
HTML5 360 VR Status
HTML5 360 VR StatusHTML5 360 VR Status
HTML5 360 VR Statustaylor224
 
폴리아트VR세미나-가상현실(VR) 기기 특성과 게임 개발 장르의 선택
폴리아트VR세미나-가상현실(VR) 기기 특성과 게임 개발 장르의 선택폴리아트VR세미나-가상현실(VR) 기기 특성과 게임 개발 장르의 선택
폴리아트VR세미나-가상현실(VR) 기기 특성과 게임 개발 장르의 선택Jong Won Park
 
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리MinGeun Park
 
5시간만에 유니티로 카드보드용 VR게임 만들기
5시간만에 유니티로 카드보드용 VR게임 만들기5시간만에 유니티로 카드보드용 VR게임 만들기
5시간만에 유니티로 카드보드용 VR게임 만들기GukHwan Ji
 
[IGC2015] 스마일게이트 김용하-VR? AR? 차세대 게임의 기반 기술
[IGC2015] 스마일게이트 김용하-VR? AR? 차세대 게임의 기반 기술[IGC2015] 스마일게이트 김용하-VR? AR? 차세대 게임의 기반 기술
[IGC2015] 스마일게이트 김용하-VR? AR? 차세대 게임의 기반 기술강 민우
 
모두의 알파고
모두의 알파고모두의 알파고
모두의 알파고Donghun Lee
 
유나이트2015서울 - 큰규모의 MMORPG - 주세영
유나이트2015서울 - 큰규모의 MMORPG - 주세영유나이트2015서울 - 큰규모의 MMORPG - 주세영
유나이트2015서울 - 큰규모의 MMORPG - 주세영Jaeyoung Han
 
딥러닝과 강화 학습으로 나보다 잘하는 쿠키런 AI 구현하기 DEVIEW 2016
딥러닝과 강화 학습으로 나보다 잘하는 쿠키런 AI 구현하기 DEVIEW 2016딥러닝과 강화 학습으로 나보다 잘하는 쿠키런 AI 구현하기 DEVIEW 2016
딥러닝과 강화 학습으로 나보다 잘하는 쿠키런 AI 구현하기 DEVIEW 2016Taehoon Kim
 
유니티 고급 과정 -4-
유니티 고급 과정 -4-유니티 고급 과정 -4-
유니티 고급 과정 -4-Kiyoung Moon
 
유니티 고급 과정 -3-
유니티 고급 과정 -3-유니티 고급 과정 -3-
유니티 고급 과정 -3-Kiyoung Moon
 
How to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your NicheHow to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your NicheLeslie Samuel
 

Viewers also liked (17)

Port polio게임 소개
Port polio게임 소개Port polio게임 소개
Port polio게임 소개
 
디자이너를 위한 NGUI의 이해
디자이너를 위한 NGUI의 이해디자이너를 위한 NGUI의 이해
디자이너를 위한 NGUI의 이해
 
VR 슈팅 액션 게임 개발 노트(오답노트) V 0.2
VR 슈팅 액션 게임 개발 노트(오답노트) V 0.2VR 슈팅 액션 게임 개발 노트(오답노트) V 0.2
VR 슈팅 액션 게임 개발 노트(오답노트) V 0.2
 
20140929 vr for_slideshare
20140929 vr for_slideshare20140929 vr for_slideshare
20140929 vr for_slideshare
 
[IGC 2016] 이장주 소장 - 재미의 심리학: 게이머가 느끼는 재미를 중심으로
[IGC 2016] 이장주 소장 - 재미의 심리학: 게이머가 느끼는 재미를 중심으로 [IGC 2016] 이장주 소장 - 재미의 심리학: 게이머가 느끼는 재미를 중심으로
[IGC 2016] 이장주 소장 - 재미의 심리학: 게이머가 느끼는 재미를 중심으로
 
[IGC 2016] 골드로쉬 김현석 - 왜 항상 기획자는 욕을 들어야만 하는 걸까? –게임 기획의 포지션 변화-
[IGC 2016] 골드로쉬 김현석 - 왜 항상 기획자는 욕을 들어야만 하는 걸까? –게임 기획의 포지션 변화-[IGC 2016] 골드로쉬 김현석 - 왜 항상 기획자는 욕을 들어야만 하는 걸까? –게임 기획의 포지션 변화-
[IGC 2016] 골드로쉬 김현석 - 왜 항상 기획자는 욕을 들어야만 하는 걸까? –게임 기획의 포지션 변화-
 
HTML5 360 VR Status
HTML5 360 VR StatusHTML5 360 VR Status
HTML5 360 VR Status
 
폴리아트VR세미나-가상현실(VR) 기기 특성과 게임 개발 장르의 선택
폴리아트VR세미나-가상현실(VR) 기기 특성과 게임 개발 장르의 선택폴리아트VR세미나-가상현실(VR) 기기 특성과 게임 개발 장르의 선택
폴리아트VR세미나-가상현실(VR) 기기 특성과 게임 개발 장르의 선택
 
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
 
5시간만에 유니티로 카드보드용 VR게임 만들기
5시간만에 유니티로 카드보드용 VR게임 만들기5시간만에 유니티로 카드보드용 VR게임 만들기
5시간만에 유니티로 카드보드용 VR게임 만들기
 
[IGC2015] 스마일게이트 김용하-VR? AR? 차세대 게임의 기반 기술
[IGC2015] 스마일게이트 김용하-VR? AR? 차세대 게임의 기반 기술[IGC2015] 스마일게이트 김용하-VR? AR? 차세대 게임의 기반 기술
[IGC2015] 스마일게이트 김용하-VR? AR? 차세대 게임의 기반 기술
 
모두의 알파고
모두의 알파고모두의 알파고
모두의 알파고
 
유나이트2015서울 - 큰규모의 MMORPG - 주세영
유나이트2015서울 - 큰규모의 MMORPG - 주세영유나이트2015서울 - 큰규모의 MMORPG - 주세영
유나이트2015서울 - 큰규모의 MMORPG - 주세영
 
딥러닝과 강화 학습으로 나보다 잘하는 쿠키런 AI 구현하기 DEVIEW 2016
딥러닝과 강화 학습으로 나보다 잘하는 쿠키런 AI 구현하기 DEVIEW 2016딥러닝과 강화 학습으로 나보다 잘하는 쿠키런 AI 구현하기 DEVIEW 2016
딥러닝과 강화 학습으로 나보다 잘하는 쿠키런 AI 구현하기 DEVIEW 2016
 
유니티 고급 과정 -4-
유니티 고급 과정 -4-유니티 고급 과정 -4-
유니티 고급 과정 -4-
 
유니티 고급 과정 -3-
유니티 고급 과정 -3-유니티 고급 과정 -3-
유니티 고급 과정 -3-
 
How to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your NicheHow to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your Niche
 

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] 버튺 클릭 웨이브 시스템 구현하기