Unity5로 리메이크한 Republique가 에셋스토어에 올라왔습니다. 그와 함께 유니티 공식 블로그에 "THE REPUBLIQUE REMASTERED IN UNITY 5 LEARN PROJECT IS HERE!"라는 글이 함께 올라왔습니다. 이 글은 유니티 공식 블로그의 글을 번역한 글입니다.
몇 달 전 Camouflaj에서 Remastering Republique: The Journey to Unity 5라는 주제로 영상 및 글을 올렸습니다. 또한 이제는 프로젝트의 일부를 에셋스토어에 공유하였습니다. 이를 통해서 Unity5를 실제 게임에서 어떻게 활용 할 수 있는 지를 확인할 수 있을 것입니다.
이 프로젝트 파일에는 교도소, 중앙 홀, 터미널 등 여러 공간이 포함되어 있습니다. 이를 통해서 리플렉션 프로브, Enlighten, 새로운 에니메이션 및 오디오 기능 등 Unity5의 기능들이 어떻게 사용되고 있는 지 확인할 수 있습니다.
ENLIGHTEN
Republique의 중앙 홀은 스튜디오에서 Unity5로 작업 한 첫번째 공간입니다. 우리(Camouflaj)는 Enlighten을 통해서 매우 놀라운 개선을 이를 수 있었습니다. 특히 씬의 천장에서 내려오는 빛은 매우 큰 효과를 보여주었습니다.
발광(Emissive) 재질은 Unity5에 추가된 것 중 하나입니다. 형광등 재질의 발광 강도(Emission intensity)를 증가시킴으로써 반사광을 만들어 씬을 밝게 조절하는 것을 보실 수 있습니다. continuous baking을 활성화시키면 즉각적으로 결과를 확인하게 됩니다. 이로써 라이팅 작업 시간을 매우 줄일 수 있게됩니다.
다음 이미지는 Emission 값을 보여주고있습니다. 이는 에니메이션 트랙을 추가하여 값을 네이메이션 시킬 수 있습니다. (역주:예를 들어 형광등의 깜빡임 등)
라이팅 탭의 간접광 강도(Indirect Intensity)를 증가시킴으로써 씬이 동적으로 업데이트되고 한층 밝아지는 것을 확인할 수 있습니다. 이는 실시간으로 보여지고 있습니다.
리플렉션 프로브는 주변 환경을 반사시킴으로써 실제같은 금속을 만들 수 있게 해줍니다.
다음 이미지의 기둥의 표면은 금속으로 되어있습니다. 반사력(reflectivity)를 높임으로써 공간적으로 정확한 반사를 얻을 수 있습니다.
아래 이미지와 같이 부드러움(smoothness)을 줄이면 반사 이미지는 거칠어지고 흐려집니다.
UNITY5 AUDIO
유니티5의 오디오 믹서는 오디오를 분류하고 출력 버스를 특정지을 수 있습니다. 이로인해 오디오를 더욱 유연하게 전송하고 혼합할 수 있습니다. ‘Ambience’그룹은 2D와 3D 서브 그룹으로 나뉩니다. 자연적으로, 3D 환경 오디오는 3D 서브 그룹으로 전송되고, 3D 버스로 할당된 오디오는 알맞는 그룹으로 연결됩니다. 각각의 그룹에서는, 볼륨(volume)과 피치(pitch)를 조절할 수 있고 오디오 필터가 적용됩니다. 또한, 개별적 혹은 전체적으로 그룹들을 실시간으로 음소거 시키거나 독주화 시킬 수 있습니다. 오디오 믹서 우측 상단의 ‘Edit on Play Mode’를 클릭하면 게임이 실행되는 동안에 편집이 가능합니다. 그 예로 우리는 게임이 실행되는 동안 ‘SFX Reverb’를 추가하여 발자국을 편집하였습니다.
만족스러운 튜닝을 마친 상태라면 오디오 셋팅을 스냅샷으로 저장할 수 있습니다. 이 스냅샷은 오디오 혼합 상태를 저장하고 다양한 사운드 프로필을 생성하여 유용하게 활용 될 수 있습니다.
MECANIM
플레이할 준비가 되었다면 한번 실행해보십시요. 좌 클릭으로 호프(케릭터 이름)를 움직일 수 있습니다. WASD로 카메라를 컨트롤 할 수 있습니다. 이 프로젝트에는 몇몇의 에니메이션이 포함되어있습니다. 하지만, 메카님 API를 이용하면 메카님 에셋을 생성하고 편집할 수 있는 많은 종류의 툴을 만들 수 있습니다.
이 프로젝트에서는, Hope에 사용된 에니메이터를 재생성하는 버튼이 존재합니다. 스크립트는 Project 폴더에 비슷한 에니메이터를 생성합니다.
[MenuItem ("Hope/Create Controller")]
static void CreateController () {
// Creates the controller
var controller = UnityEditor.Animations.AnimatorController.CreateAnimatorControllerAtPath ("Assets/HopeScriptCtrl.controller");
// Add parameters
controller.AddParameter("Walk", AnimatorControllerParameterType.Bool);
controller.AddParameter("TurnLeft", AnimatorControllerParameterType.Bool);
controller.AddParameter("TurnRight", AnimatorControllerParameterType.Bool);
controller.AddParameter("HalfTurn", AnimatorControllerParameterType.Bool);
// Add StateMachines
var rootStateMachine = controller.layers[0].stateMachine;
var stateMachineStand = rootStateMachine.AddStateMachine("Stand");
// Add States
var stateIdle = stateMachineStand.AddState("Idle");
var stateTurnLeft = stateMachineStand.AddState("TurnLeft");
var stateTurnRight = stateMachineStand.AddState("TurnRight");
var stateHalfTurn = stateMachineStand.AddState("HalfTurn");
var stateWalk = stateMachineStand.AddState("Walk");
stateIdle.motion = AssetDatabase.LoadAssetAtPath("Assets/Animations/Hope Animations/StandingIdleLooking.fbx", typeof(AnimationClip)) as Motion;
stateTurnLeft.motion = AssetDatabase.LoadAssetAtPath("Assets/Animations/Hope Animations/MoveStand90_L.fbx", typeof(AnimationClip)) as Motion;
stateTurnRight.motion = AssetDatabase.LoadAssetAtPath("Assets/Animations/Hope Animations/MoveStand90_R.fbx", typeof(AnimationClip)) as Motion;
stateHalfTurn.motion = AssetDatabase.LoadAssetAtPath("Assets/Animations/Hope Animations/MoveStand180.fbx", typeof(AnimationClip)) as Motion;
stateWalk.motion = AssetDatabase.LoadAssetAtPath("Assets/Animations/Hope Animations/MoveWalk_F.fbx", typeof(AnimationClip)) as Motion;
// Add Transitions
var idle2TurnLeft = stateIdle.AddTransition (stateTurnLeft);
var turnLeft2Idle = stateTurnLeft.AddTransition (stateIdle);
idle2TurnLeft.AddCondition(UnityEditor.Animations.AnimatorConditionMode.If, 0, "TurnLeft");
idle2TurnLeft.duration = 0.025f;
turnLeft2Idle.hasExitTime = true;
turnLeft2Idle.exitTime = 0.85f;
turnLeft2Idle.duration = 0.15f;
var idle2TurnRight = stateIdle.AddTransition (stateTurnRight);
var turnRight2Idle = stateTurnRight.AddTransition (stateIdle);
idle2TurnRight.AddCondition(UnityEditor.Animations.AnimatorConditionMode.If, 0, "TurnRight");
idle2TurnRight.duration = 0.025f;
turnRight2Idle.hasExitTime = true;
turnRight2Idle.exitTime = 0.85f;
turnRight2Idle.duration = 0.15f;
var idle2HalfTurn = stateIdle.AddTransition (stateHalfTurn);
var halfTurn2Idle = stateHalfTurn.AddTransition (stateIdle);
idle2HalfTurn.AddCondition(UnityEditor.Animations.AnimatorConditionMode.If, 0, "HalfTurn");
idle2HalfTurn.duration = 0.025f;
halfTurn2Idle.hasExitTime = true;
halfTurn2Idle.exitTime = 0.85f;
halfTurn2Idle.duration = 0.15f;
var idle2Walk = stateIdle.AddTransition (stateWalk);
var walk2Idle = stateWalk.AddTransition (stateIdle);
idle2Walk.AddCondition(UnityEditor.Animations.AnimatorConditionMode.If, 0, "Walk");
idle2Walk.duration = 0.025f;
walk2Idle.AddCondition(UnityEditor.Animations.AnimatorConditionMode.IfNot, 0, "Walk");
walk2Idle.duration = 0.25f;
}
이 프로젝트가 여러분들께 도움이 되셨길 바랍니다. ( 에셋 스토어 링크 : https://www.assetstore.unity3d.com/en/#!/content/34352?utm_source=unity3d&utm_medium=blog&utm_campaign=ASContent_Camouflaj)
*참고 : 최종 버젼의 게임 비쥬얼은 이 프로젝트와 약간은 달라질 수도 있습니다.
'Unity3D > Graphics' 카테고리의 다른 글
몹의 다양화(variation) 작업을 위한 파츠 컬러 쉐이더(Parts Color Shader) (2) | 2015.08.24 |
---|---|
유니티 5.1부터는 Unity Analytics가 기본적으로 통합되었습니다. (0) | 2015.06.12 |
모바일 기기의 Tile Based Rendering(타일 기반 렌더링)과 유니티에서의 주의 사항 #2 : TBR 대응 리소스 제작시 주의점 (2) | 2015.06.09 |
모바일 기기의 Tile Based Rendering(타일 기반 렌더링)과 유니티에서의 주의 사항 #1 : TBR의 이해 (1) | 2015.06.09 |
화요일은#UNITYTIPS의 날 (TUESDAYS ARE FOR #UNITYTIPS) (0) | 2015.05.27 |
유니티의 새로운 2D 툴 미리 보기(EARLY ACCESS TO NEW 2D TOOLS) (0) | 2015.05.27 |
new GUI (ugui) 최적화 팁 (0) | 2015.05.27 |
Unity에서 쿨타임 버튼 구현하기 (0) | 2015.05.27 |