Unity/Unity 학습정리(19)
-
Unity - 몬스터 모드 변경
파트너 몬스터가 플레이어를 따라다닐 때, 적 몬스터를 만나면 공격한다. 하지만 그걸 원하지 않을 때가 있는데 NonCombat모드랑, Combat모드를 구분해서 FSM을 조절하는 것을 구현 해봤다. ActionModeHandler.cspublic enum AcitonMode{ NonCombat, Combat, Count}/// /// 현재 액션 상태를 다루고 다음 액션으로 넘어가게 하는 핸들러/// public class ActionModeHandler{ private AcitonMode _curMode; public event Action OnChangedMode; public ActionModeHandler() { _curMode = AcitonMod..
2024.07.11 -
Unity - Interface로 원하는 동작 해보기
Interface는 클래스와 비슷하게 메서드, 필드, 이벤트 등을 가지지만 실제 구현은 인터페이스 내에서 이루어지지 않는다. 해당 인터페이스를 상속받는 클래스에서 직접 구현을 해주어야하고, 인터페이스는 객체를 자체적으로 생성하지 못한다. 유니티에서는 인터페이스를 활용한 장점이 또 한가지 있는데 TryGetComponent()를 이용해서 해당 컴포넌트를 가지고있는지 확인하고 가지고 있다면 코드를 실행하는 방법이 있다. public interface IDamageable{ void TakeDamage(int damage); bool IsDead();} IDamageable 인터페이스를 만들고 해당 인터페이스를 상속시키면 TakeDamage와 IsDead를 구현해야한다.public virtual ..
2024.07.10 -
플레이어를 쫓아다니는 몬스터 AI 구현
StatMachine분리분리를 하지 않았을 때 문제점대부분의 기능을 공유하는 두 클래스에서 상속을 받았을때 BaseMonster의 상속도 받는 다는 부분이다.하지만 PartnerMonster는 플레이어를 따라다니고 멀어지면 추적한다.EnemyMonster는 플레이어가 가까워지면 추적하고 멀어지면 다시 원래 자리로 돌아간다.해결방법public MonsterStateMachine(BaseMonster monster){ Monster = monster; if (Monster.GetType() == typeof(PartnerMonster)) { Debug.Log(Monster.GetType()); IdleState = new PartnerMonsterIdleState(t..
2024.07.04 -
FSM StateMachine 상속
최종 프로젝트 진행중에 같은 State를 가지는 객체가 있는데 State안에서 분기되는 기준이랑 행동하는 로직이 조금씩 다른 두 개의 객체가 있었다. 해당 객체를 BaseMonster를 부모로 상속을 시켜주려하다보니 StateMachine도 상속을 시키게 되는 구조가 되었는데 그럼 각 객체는 겹치는 부분에 대해서 어떻게 처리를 할지 고민이었다. BaseMosnter를 부모로 PartnerMonster, EnemyMonster가 상속을 받는데 StateMachine도 상속을 받는다. 근데 상태들은 거의 비슷하고 동작의 로직이 조금씩 다르다ex) PartnerMonster는 Player를 따라다니고, 적을 탐지하면 추적 및 공격ex) EnemyMonster는 플레이어를 탐지하면 추적 및 공격, 자기자리..
2024.07.01 -
Unity - Behaviour Tree (1)
FSM으로 이것저것 구현하다보면 상태가 많아지거나, 객체가 복잡해질 때 한계가 느껴진다. FSM은 특성상 한개의 상태만 가질 수 있고, 전이를 시키다보면 내가 원하는 상태로 전이 시킬 때 곧 바로 전이가 되는것이아니라 많은 상태를 거치게 된다거나, 뭔가 수정해야할게 많아 지는 상황이 생길 수 도 있다. 이것은 FSM은 모든 상태들이 상호 관계로 이루어져있다는 점에 있다. 이를 보완하기위해 B.T(Behaviour Tree)가 있는데 해당 Behaviour Tree는 말그대로 행동 트리이다. 모든 행동들이 Tree형식으로 관리된다. Node가 존재하고 부모, 자식 Node들이 존재한다. 목차Behaviour Tree Node 공부하면서 느낀점 Behaviour Tree탐색순서Behaviour Tree..
2024.06.25 -
Unity - FSM(Finite State Machine)(3)
마지막으로 FSM이 실제로 어떻게 상태가 변환되는 과정 및 결과이다. 개인적으로 이 부분이 FSM에 있어서 중요하다고 생각되는데, 어떤 상태를 가지던 해당 상태는 다른 상태로 이전될 수 있는 조건을 가지고 상태전이를 하는 과정을 겪는다. Idle 상태 : 적을 발견하면 Chasingpublic override void Update(){ base.Update(); if(IsInChasinginRange()) { stateMachine.ChangeState(stateMachine.chasingState); return; }}protected bool IsInChasinginRange(){ if (stateMachine.target == null) ret..
2024.06.20