- 공통적으로 적용되는 부분(쿨타임 계산 등)은 없애고 각 노드를 따라가면서 적용하도록 만들었다.
protected override Node SetTree()
{
InitBTDict();
Node root = new Selector(new List<Node>
{
new Sequence(new List<Node>()
{
new CheckNextPhaseHP(this),
new UpdatePhase(this),
}),
new Sequence(new List<Node>()
{
new CheckDie(this),
new Die(this),
}),
new Sequence(new List<Node>()
{
new Selector(new List<Node>()
{
new Sequence(new List<Node>()
{
new Patrol(this, _rigid, waypoints),
new RunningCoolTime(this),
}),
new Selector(new List<Node>()
{
new Boss3Phase1(this),
new Boss3Phase2(this),
new Boss3Phase3(this)
}),
new Sequence(new List<Node>()
{
new DefaultAttack(this, 5),
new RunningCoolTime(this),
})
})
}),
});
return root;
}
원인 : 코드상의 문제는 아니었고 깃 공유 과정에서 유료 에셋이 포함된 External 폴더를 Ignore 시켰는데 이 과정에서 공유가 안 되어 마젠타 색이 뜬 것
해결 : 따로 폴더를 Export 해 공유함으로써 해결
내일 할 것
- 1페이즈 구현 마무리
오늘의 회고
오늘은 저번에 Behaviour Tree를 재구성한 것을 코드로 적용하고 페이즈 1을 거의 다 구현하였다. 페이즈 1 때는 보스가 수류탄을 던지는 페이즈인데 베지어 곡선을 사용하여 포물선으로 플레이어에게 닿을 수 있도록 했다. 근데 오류가 많아서 내일 오전 중에 수정하고 오후에는 페이즈 3을 구현할 수 있도록 해야겠다. 내일도 파이팅!
- 애니메이터의 Has Exit Time을 사용하지 않고 Animator의 Tag를 검사한 후 normalizeTime이 1보다 클 시 탈출하도록 함
내일 할 것
- Skill Node 내부에 있던 Phase 분리
- Behaviour Tree 구조 재구성 -> 순환 구조 같다는 피드백
오늘의 회고
오늘은 애니메이션 버그를 수정하고 Phase2 스킬을 구현하였다. 어제 계획대로라면 수류탄을 던지는 Phase1 모션을 구현했어야 하지만 먼저 재밌어 보이는 것 우선으로 개발하자고 생각하여 Phase2 스킬을 구현하게 된 것이다. Behaviour Tree 피드백이 들어와서 내일은 Behaviour Tree를 재구성할 것이고 Skill Node 내부에 있던 Phase도 분리할 것이다. 내일도 열심히 해보자. 파이팅!
public Dictionary<BTValues, object> BTDict { get; private set; } = new Dictionary<BTValues, object>();
private void Awake()
{
_rigid = GetComponent<Rigidbody>();
StatHandler = new EnemyStatHandler(enemySO, null, null);
AnimationController = GetComponentInChildren<BossAnimationController>();
AnimationController.Init();
}
protected override Node SetTree()
{
InitBTDict();
Node root = new Selector(new List<Node>
{
new Sequence(new List<Node>
{
new RunningCoolTimeNode(this),
new CheckHpNode(this, PhaseSO.PhaseInfo.Length),
new UpdatePhaseNode(this),
new PatrolNode(this, _rigid, waypoints),
new Selector(new List<Node>
{
new Sequence(new List<Node>
{
new CheckSkillCoolTimeNode(this),
new UseSkillNode(this)
}),
new ShootNode(this, GameManager.Instance.PlayerTransform ,5)
}),
}),
new DieNode()
});
return root;
}
public void SetCurrenPhase(int currentPhase)
{
CurrentPhase = currentPhase;
}
private void InitBTDict()
{
if (!BTDict.ContainsKey(BTValues.CurrentPhaseSkillCoolTime))
BTDict.Add(BTValues.CurrentPhaseSkillCoolTime, 0f);
if (!BTDict.ContainsKey(BTValues.WasSkillUsed))
BTDict.Add(BTValues.WasSkillUsed, false);
if (!BTDict.ContainsKey(BTValues.CurrentSkillElapsedTime))
BTDict.Add(BTValues.CurrentSkillElapsedTime, 0f);
if (!BTDict.ContainsKey(BTValues.IsAnyActionPlaying))
BTDict.Add(BTValues.IsAnyActionPlaying, false);
}
문제점
이전에선 UseSkillNode 상태에 들어가지 못하는 버그가 있었음
원인
이전의 첫 번째 Sequence 부분에서 Failure 상태라면 바로 Root까지 반환하게 됨
해결
UseSkillNode과 ShootNode 상태를 SelectNode와 함께 CheckSkillCoolTimeNode로 판별하여 결과에 따라 하나를 수행하도록 함
추가 변경 사항
- 쿨타임 더하는 부분 로직 계산 부분 분리
- BTDict라는 딕셔너리를 만들어 여러 곳에서 쓰이는 변수들 저장
내일 할 것
- 애니메이션 버그 고치기(자꾸 두리번거림)
- 페이즈 1 스킬 구현 (폭탄 던지기)
오늘의 회고
오늘은 보스 행동트리에 맞춰서 애니메이션을 적용하였다. 애니메이션 적용하는 것은 어렵지 않았지만 쿨타임을 계산한다던가 하는 부분을 위해 따로 BehaviourTree에서 프로퍼티로 접근할 딕셔너리를 만들기도 했다. 내일은 애니메이션 버그와 페이즈 1 스킬을 구현할 생각이다. 내일도 파이팅!
protected override Node SetTree()
{
Node root = new Selector(new List<Node>
{
new Sequence(new List<Node>
{
new CheckHpNode(this, phaseSO.PhaseInfo.Length),
new UpdatePhaseNode(this),
new PatrolNode(_rigid, waypoints, StatHandler.Data.SpeedMax),
new Sequence(new List<Node>
{
new CheckSkillCoolTimeNode(this),
new UseSkillNode(this)
}),
new ShootNode(bulletPrefab.GetComponent<Bullet>(), GameManager.Instance.PlayerTransform, transform ,5)
}),
new DieNode()
});
return root;
}
오늘의 이슈 / 내일 할 것
오늘 이슈
문제점
- 변이 시 마젠타 색 남아있음
- 무기가 겹쳐져서 안 없어짐
원인
- 코루틴을 중간에 멈추는 부분이 있는데 여러 입력이 들어왔을 시 중간에 변이가 실행 중인 코루틴이 멈춰서 두 가지 문제가 나왔던 것임
해결
- StopCoroutine 부분을 제거
내일 할 것
Running 시 Behaviour Tree 탈출 못 하는 것 해결하기
오늘의 회고
오늘은 어제의 Sequence Node에 이이서 Selector Node에 대해 배웠다. Selector Node를 어떻게 쓰느냐에 따라 분기를 나눌 수 있는데 엄청 중요한 Node인 것 같다. Patrol 상태일 때 Running State가 되면 Hp를 체크 못 하는 문제가 있는데 이를 내일 해결해보도록 해야겠다. 내일도 파이팅!
오늘은 어제 만든 쉐이더 효과를 스크립트에서 제어하도록 했고 그 과정 중에 코루틴을 사용했다. 코루틴에서 WaitForSeconds라는 함수를 반환할 수 있는데 매번 new 하면 GC가 많이 쌓이니 CoroutineRef라는 클래스를 만들어 딕셔너리에 호출된 WaitForSeconds들을 등록하는 딕셔너리를 필드로 놓고 반환해주는 메서드를 만들었다. 내일도 열심히 해보자 파이팅!
오늘은 쉐이더 그래프를 이용하여 Dissolve 효과와 Aura 효과를 제작하였다. 변이가 핵심 기능이니만큼 연출적으로 많이 보여주어야 한다고 생각해서 만들게 되었다. 이후에는 튜토리얼처럼 변이을 한 번씩 테스트 할 수 있는 씬을 만들고 이후에 하나씩 변이 기능을 얻어가면서 플레이 할 수 있도록 해야겠다. 내일도 파이팅!
3D 플랫포머 게임으로 장르를 정한 것과 액션 게임에 대한 장르적 연출이 부족하다고 들었다.
그래서 팀원들끼리 의논해본 결과 플랫포머의 특성에 맞게 각 플랫폼과 상호작용 할 수 있는 기능들을 늘리고액션 게임에서의 속도감을 위해 캐릭터 속도 스탯을 조정하거나 공격 캔슬을 만든다던지 또는 타격 연출을 추가 한다던지 해서 조정할 생각이다.
오늘의 이슈 / 내일 할 것
오늘 이슈
- 기획 피드백
내일 할 것
- 캐릭터 스탯 조정하기
- 공격 연출 추가하기
오늘의 회고
오늘은 기획 피드백을 받고 선택과 집중을 하게 되었다. 플랫포머와 액션 장르에 대한 피드백을 받았고 머리를 망치로 한 대 맞은 것처럼 부족한 부분이 드러나게 되었다. 게임의 재미를 위해 장르적 특성을 좀 더 보여줄 필요가 있어 보였다. 팀원과 얘기한대로 진행해보고 점점 나아지도록 하자. 내일도 파이팅!