Development 39

[Retro유니티] 다형성 및 Action, Delegate를 통한 Event 구현: Virtual/Abstract/Interface 차이

다형성적 AI 및 Player 모두 포함하여 공유하는 기능을 가진, LivingEntity 클래스를 만들자.느슨한 커플링을 사용해서, 어느 자식클래스인지 구체적으로 모르더라도, 부모가 가진 메서드면 호출하게끔 구현할 수 있다. 다형성 사용 패턴- C#에서 부모클래스의 함수는 base로 접근할 수 있다. 이 정도만 추가로 숙지하면 될듯하다. LivingEntity ClassMonoBehaviour 및 IDamageable을 상속체력체력회복공격당할수있음살거나 죽는 상태가 존재함.using System;using UnityEngine;// 생명체로서 동작할 게임 오브젝트들을 위한 뼈대를 제공// 체력, 데미지 받아들이기, 사망 기능, 사망 이벤트를 제공public class LivingEntity : Mono..

[Retro유니티] Shooter 구현 - IK를 사용한 손/발 위치와 총 위치 <-> Animation 대응

PlayerShooter 스크립트를 만들자.1. 입력에 따라 총을 쏘거나 재장전한다.2. 손은 항상 총의 손잡이에 위치하게 한다. -> IK를 사용해야 한다. IK란?먼저 FK를 알아야 한다.FK란?Forward Kinematics 의 줄임말이다.부모 joint에서 자식 joint 순서로 움직임을 적용한다.FK로 물건을 집으면1. 어깨를 움직인다2. 팔을 움직인다3. 손을 움직인다. 순으로 동작한다.FK로 물건을 집는다면, 손의 위치는 누적계산된 최종결과이기 때문에, 손의 위치를 먼저 정하고 거기에 맞춰서 애니메이션을 변형할 수 없기 때문에, 손의 위치로 물건을 순간이동해야 한다. 반대로, IK는 자식 joint 에서 부모 joint 순서로 움직임을 적용하는 것이다. Inverse Kinematics1...

[Retro유니티] Gun 스크립트 - Coroutine을 사용한 Shot, Reload 구현

Gun과 관련된 메서드를 구현한다. 함수Awake(): 사용할 컴포넌트를 가져온다.OnEnable(): 총의 상태를 초기화한다. 컴포넌트가 활성화될 대마다 매번 실행된다.Fire(): Shot()을 안전하게 감싼다.Shot(): 실제 발사처리를 한다.ShotEffect(): 발사효과를 재생하고, 탄 궤적을 그린다.Reload(): 재장전을 한다. 실패시 false 반환.ReloadRoutine(): 재장전이 가능할 때만 Reolad를 호출한다. IEnumerator 를 반환하는데, 이들은 코루틴 메서드이다. 참고) enum flag를 사용하면, 하나의 enum 변수가 2개 이상의 값을 가질 수 있다. 코루틴번쩍이는 탄알궤적을 ShotEffect() 메서드가 구현해야하는데, 그러기 위해서는1. 라인렌더러 ..

[Retro유니티] 인터페이스를 통한 IDamageable 구현 및 Guns 객체생성

1. Component를 제작해보자.- 총과 총을 쏘는 Shooter Component를 제작한다.2. Raycast 를 사용해서 사격감지를 하자.3. Particle 을 사용해서 시각효과를 만들자.4. CoRoutine을 사용해 처리중간에 대기시간을 삽입하자.5. C# 인터페이스를 사용해 통일된 Damage 메서드를 구현하자6. IK를 사용해서 슈터 구현시, 캐릭터가 총을 자연스럽게 잡게 하자.  인터페이스일반적으로 Player는 Monster, 상대Player, 상자, 울타리 등등 다양한 오브젝트를 공격할 수 있다.각 Object들은 공격받았을 시 반응이 다를 수 있다.최악의 구현법은, 공격함수에서 공격대상 Object를 일일이 검사하고 if문으로 각 서로다른 반응을 구현하는 것이다.세련된 방법은 I..

[Retro유니티] Cinemachine 을 통한 연출구현

이전 상태에서는, 카메라의 위치가 정적이라서 플레이하기 까다로웠다.맵 전체를 보이자니 플레이어가 너무 작게 보이고, 맵을 확대하자니 플레이어 이동위치에 따라 플레이어가 보이지 않았다.우리는 연출이 필요하다.Cinemachine은 이러한 카메라의 움직임을 손쉽게 제어할수있는 유니티 공식 패키지이다. 사실 연출은 생각보다 까다롭다.뛰어난 연출이 되어있는 게임은, 추적을 구현하는데 복잡한 수식이 필요하다.직접 구현을 한다면, 좋은 장면이 나올 때까지 카메라 위치를 계속 변경하면서 카메라가 움직일 궤도를 그려야 한는데 이건 시간과 노력이 무척 드는 작업이다. 시네머신은 연출에 필요한 코드와 조정작업 대부분을 대체할 수 있다.레이싱/어드벤쳐/TPs 등 장르마다 고유한 카메라 동작을 별다른 스크립트 작성없이 구현가..

[Retro유니티] 캐릭터 이동 구현

캐릭터 이동을 구현하는 Script를 Player Character 게임오브젝트에 추가하자. 이 예제에서는, 입력과 액터를 나누었다.입력: PlayerInput 스크립트는 Player의 입력을 감지하고 다른 Component에 알려주는 스크립트이다.액터: PlayerMovement 스크립트는 입력에 다라 캐릭터를 이동/회전시킨다. 입력감지코드와 입력처리코드를 분리함으로써, 코드관리가 쉬워진다.예를 들어, 해당 게임이 PC에서 모바일 or 콘솔로 이식할 때, 입력감지코드만 변환하여 사용가능해진다. PlayerInput.csPlayerInput 스크립트는 public float로 선언된 변수를 통해 입력결과를 외부로 노출시킨다.  ChatGPT)get; private set;은 C#에서 자동 구현 속성(au..

[Retro유니티] Upper Body 레이어 확인, Avatar Mask 적용

이전 포스트의 BaseMovement 레이어와 마찬가지로,UpperBody 레이어를 확인하면 Die는 동일하게 동작한다. Condition은 Die트리거이다.다만, Die상태에서는 BaseMovement에서 사망 애니메이션 클립을 재생할 것이므로, 따로 UpperBody 레이어에서는 애니메이션 클립이 없다.따라서, None(Motion) 임을 확인가능하다. 레이어가 2개 이상 있으면, Override방식으로 동작한다. 즉 겹치면 우선권이 있는 Layer가 가져간다는 뜻이다.즉, BaseMovement가 위에 있고, UpperBody가 아래에 있으면, Upper Body가 더 바깥에서 보인다.  애니메이터의 레이어별로 부위를 다르게 적용하려면, Avatar Mask를 설정해야 한다.아바타 마스크Humano..

[Retro유니티] 플레이어 캐릭터 생성 및 Blend Tree Animator 분석

미리 준비한 3D 캐릭터 모델을 사용한다. 3D 모델 사용하기 & RigidBody/CapsuleCollider/AudioSource Component 넣기3D모델 에셋은 FBX 파일이다.해당 파일을 드래그해서 오브젝트를 생성할 수 있다. 3D모델로 생성된 Game Object는, Animator Component를 가진다.Angular Drag: 각 항력 -> 너무 낮으면, 충돌시 휘리릭 회전하는 수가 있다.Freeze Rotation: Y축에 대해서만 회전가능하게 한다. 이제 Collider를 추가하여 물리적 표면을 만들자.Capsule 형태로 Collider를 만들었다. 이제 Audio Source를 넣자. 이제 기초중의 기초를 만들었다.다음은 Animator를 설정하자. Animator 설정미리 ..

[Retro유니티] LightMap과 Baking

Lighting은 연산비용이 비싸므로, Unity는 Lighting Data Asset을 사용해서 Lighting의 실시간 연산량을 줄인다.Lighting Data Asset에 포함된 주요 데이터 중 하나는 Lightmap이다.Lightmap은 Object가 빛을 받았을 때, 어떻게 보일지를 미리 그려둔 텍스쳐이다.Lighting Data Asset을 생성하는 작업을 Baking 이라고 한다. Baking을 해보자. Baking매번 Scene Load시마다 Bake하면 버벅인다. 끄자. Environment Lighting환경광을 설정하자.환경광은, Scene에서 가장 기본으로 깔리는 빛이며, 모든 Object에 적용된다.모든 방향에서 동일세기로 들어오기 때문에, 그림자 및 명암을 만들지 않는다.환경광 ..

[Retro유니티] ZombieSurvivor - 레벨 아트 사용

목표웨이브형 좀비 탑 다운 슈터게임을 제작하는 것기능일정주기로 좀비가 생성됨.시간이 지날수록 주기당 생성되는 좀비의 수 증가.좀비는 플레이어의 위치를 주기적으로 파악하고 항상 최적경로로 플레이어를 추적함.좀비의 이동속도, 공격력, 체력은 랜덤.좀비의 스펙에 따라 색깔이 점점 붉어짐.플레이어 체력은 플레이어를 따라다니는 원형바로 확인가능.기관총 탄약은 유한하고 체력도 자동회복되지 않음.탄약 및 체력은 아이템으로 회복가능.아이템은 플레이어 근처의 랜덤위치에 주기적으로 생성되며, 일정 시간 뒤에 사라짐.후처리 효과를 사용해 게임화면을 보정함.패키지매니저, 시네머신, 포스트-프로세싱 스택을 사용할 것.  원본 repository의 14를 그대로 가져오면  Assets 폴더- Gizmos: 시네머신용 기즈모 아이..