진행한 것들

페이즈 1 - 수류탄 투척 / 샷건 수정

- 샷건 탄 변경

- 페이즈 1 수류탄 투척 구현

 

 

오늘의 이슈 / 내일 할 것

오늘 이슈

- 수류탄 투척 시 각도가 부자연스러움

- 총알 각도가 이상함

- 총알 방향이 이상함

 

내일 할 것

- 오늘 이슈를 내일 아침에 수정할 것

- 페이즈 3 만들기

 

 

오늘의 회고

 오늘은 어제에 이어서 수류탄 투척을 구현하고 샷건 탄환을 바꿨다. 또한 보스의 공격을 맞았을 때 플레이어가 데미지를 입도록 했다. 아직 부자연스러운 점이 많지만 내일 동안 해결해서 바로 페이즈 3 스킬까지 만들 수 있도록 할 것이다. 내일도 파이팅하자!

 

진행한 것들

보스 Behaviour Tree 변경 코드 적용

- 보스 Behaviour Tree를 구조를 바꾼 것을 코드로 적용했다.

- 공통적으로 적용되는 부분(쿨타임 계산 등)은 없애고 각 노드를 따라가면서 적용하도록 만들었다.

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;
}

 

 

 

오늘의 이슈 / 내일 할 것

오늘 이슈

문제점 : 저번 변이에서의 이슈가 다른 팀원의 환경에서는 해결되지 않음

https://jcdevelop98.tistory.com/379

 

DevLog - 이그라엘(IGRAL) Behaviour Tree와 SelectorNode

진행한 것들 보스 Behaviour Tree와 SelectorNode 이전에 이어서... https://jcdevelop98.tistory.com/378 DevLog - 이그라엘(IGRAL) Behaviour Tree와 Sequence Node 진행한 것들 보스 Behaviour Tree와 Sequence Node Behaviour Tree - 상태

jcdevelop98.tistory.com

원인 : 코드상의 문제는 아니었고 깃 공유 과정에서 유료 에셋이 포함된 External 폴더를 Ignore 시켰는데 이 과정에서 공유가 안 되어 마젠타 색이 뜬 것

해결 : 따로 폴더를 Export 해 공유함으로써 해결

내일 할 것

- 1페이즈 구현 마무리

 

오늘의 회고

 오늘은 저번에 Behaviour Tree를 재구성한 것을 코드로 적용하고 페이즈 1을 거의 다 구현하였다. 페이즈 1 때는 보스가 수류탄을 던지는 페이즈인데 베지어 곡선을 사용하여 포물선으로 플레이어에게 닿을 수 있도록 했다. 근데 오류가 많아서 내일 오전 중에 수정하고 오후에는 페이즈 3을 구현할 수 있도록 해야겠다. 내일도 파이팅!

진행한 것들

보스 Behaviour Tree 재구성

보스 Behaviour Tree를 재구성하게 되었습니다.

- Phase를 Skill Node와 구분하였습니다.

 

오늘의 이슈 / 내일 할 것

오늘 이슈

 

내일 할 것

- 1,3 페이즈 구현

- 구글 개발자 계정 만들기

 

오늘의 회고

 오늘은 튜터님의 피드백으로 Behaviour Tree를 재구성하는 시간을 가졌다. 여기서 Phase를 스킬로부터 구분해서 UsingSkill Node가 너무 커지지 않게 방지했다. 또한 Selector를 이용하여 Phase 별로 다른 행동을 수행하게 만들었다.

내일은 구글 개발자 계정을 만들어 볼 계획이다. 내일도 파이팅!

진행한 것들

보스 Phase2의 스킬을 구현

- 보스의 페이즈 2 스킬을 구현

- 스킬 쿨타임이 차면 스킬을 사용

 

 

오늘의 이슈 / 내일 할 것

오늘 이슈

문제점

- 애니메이션 중 총 쏠 때 두리번 거리는 이슈

원인

- 애니메이션이 끝나자마자 Attack 상태를 탈출하여 생기는 문제

해결

- 애니메이터의 Has Exit Time을 사용하지 않고 Animator의 Tag를 검사한 후 normalizeTime이 1보다 클 시 탈출하도록 함

 

내일 할 것

- Skill Node 내부에 있던 Phase 분리

- Behaviour Tree 구조 재구성 -> 순환 구조 같다는 피드백

 

오늘의 회고

 오늘은 애니메이션 버그를 수정하고 Phase2 스킬을 구현하였다. 어제 계획대로라면 수류탄을 던지는 Phase1 모션을 구현했어야 하지만 먼저 재밌어 보이는 것 우선으로 개발하자고 생각하여 Phase2 스킬을 구현하게 된 것이다. Behaviour Tree 피드백이 들어와서 내일은 Behaviour Tree를 재구성할 것이고 Skill Node 내부에 있던 Phase도 분리할 것이다. 내일도 열심히 해보자. 파이팅!

진행한 것들

보스 Behaviour Tree와 애니메이션 연결

보스의 패트롤과 공격 부분을 애니메이션과 연결했습니다.

 

 

오늘의 이슈 / 내일 할 것

오늘 이슈

- 어제 한 BehaviourTree의 SetTree부분이 논리적으로 잘못 되어 다시 작성

https://jcdevelop98.tistory.com/379

 

DevLog - 이그라엘(IGRAL) Behaviour Tree와 SelectorNode

진행한 것들 보스 Behaviour Tree와 SelectorNode 이전에 이어서... https://jcdevelop98.tistory.com/378 DevLog - 이그라엘(IGRAL) Behaviour Tree와 Sequence Node 진행한 것들 보스 Behaviour Tree와 Sequence Node Behaviour Tree - 상태

jcdevelop98.tistory.com

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 스킬을 구현할 생각이다. 내일도 파이팅!

 

진행한 것들

보스 Behaviour Tree와 SelectorNode

이전에 이어서...

https://jcdevelop98.tistory.com/378

 

DevLog - 이그라엘(IGRAL) Behaviour Tree와 Sequence Node

진행한 것들 보스 Behaviour Tree와 Sequence Node Behaviour Tree - 상태에는 Running, Success, Failure가 있음 - Root가 되는 Node를 가지고 있으며 Update 문에서 Evaluate 함수를 호출하여 노드의 조건에 따라 동작을 수

jcdevelop98.tistory.com

 

Selector Node : 조건에 따라 어떤 노드를 실행할 지 정하는 Node이다.

- 자식 노드들을 왼쪽에서 오른쪽 순으로 진행

- 자식 노드 중에 Success 또는 Running 노드가 있다면 해당 노드 실행 후 종료

 

구상 중인 것

- Selector Node에서 Sequence Node의 자식 Node인 CheckHPNode를 체크하여 Failure면 DieNode 수행, 아니라면 Sequence 자식 Node들 수행

(아래 코드가 논리적으로 잘못되어 다음 포스트 내용으로 수정)

https://jcdevelop98.tistory.com/380

 

DevLog - 이그라엘(IGRAL) Behaviour Tree와 애니메이션 연결

진행한 것들 보스 Behaviour Tree와 애니메이션 연결 보스의 패트롤과 공격 부분을 애니메이션과 연결했습니다. 오늘의 이슈 / 내일 할 것 오늘 이슈 - 어제 한 BehaviourTree의 SetTree부분이 논리적으로

jcdevelop98.tistory.com

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를 체크 못 하는 문제가 있는데 이를 내일 해결해보도록 해야겠다. 내일도 파이팅!

진행한 것들

보스 Behaviour Tree와 Sequence Node

Behaviour Tree

- 상태에는 Running, Success, Failure가 있음

- Root가 되는 Node를 가지고 있으며 Update 문에서 Evaluate 함수를 호출하여 노드의 조건에 따라 동작을 수행함

 

Sequence Node : 리스트에 들어간 순서대로 foreach문을 돌면서 수행

- 해당 Node의 현재 프레임에서의 상태가 Running 또는 Failure일 때는 state가 반환되어 다음 프레임에서 다시 체크하게 됨

- 해당 Node의 현재 프레임에서의 상태가 Success라면 다음 Node로 넘어가게 됨

- 순차적으로 진행해야할 때 사용

현재 구현된 것

Sequence Node { Patrol Node - 보스가 특정 웨이 포인트로 이동 (도착 시 Success) -> ShootNode - 총알을 발사함 }

 

 

오늘의 이슈 / 내일 할 것

오늘 이슈

 

 

내일 할 것

Selector Node 구현 다른 행동들 적용해보기

 

오늘의 회고

 오늘은 행동 트리에 대해서 배우고 간단하게 Sequence Tree까지 배워보았다. 바로 적용하기는 힘들지만 내일 Selector까지 공부해서 코드로 구현할 수 있도록 해봐야겠다. 내일도 파이팅!

진행한 것들

변이 효과 UI 연결

변이 효과를 UI에 연결하고 자연스럽게 보이도록 코드로 수치를 조절했다.

켜질 때오브젝트를 먼저 키고 서서히 Dissolve 값이 증가하도록 했다면

꺼질때Dissolve 값이 먼저 감소하고 오브젝트를 나중에 끄도록 했다.

Aura 효과는 Dissolve 효과보다 더 길게 만들어 변신하는 느낌을 더 줬다.

public IEnumerator ShowWeaponEffectGradually(List<GameObject> goList)
{
    _data.DissolveMaterial.DOFloat(1, _data.SplitValue, _data.DissolveDuration);

    foreach (GameObject go in goList)
    {
        go.SetActive(true);
    }

    ActivateAura(true);
    yield return CoroutineRef.GetWaitForSeconds(_data.AuraDuration);
    ActivateAura(false);
}

public IEnumerator ShowWeaponEffectWithoutDissolve(List<GameObject> goList)
{
    foreach (GameObject go in goList)
    {
        go.SetActive(true);
    }

    ActivateAura(true);
    yield return CoroutineRef.GetWaitForSeconds(_data.AuraDuration);
    ActivateAura(false);
}

public IEnumerator ConcealWeaponEffectGradually(List<GameObject> goList)
{
    _data.DissolveMaterial.DOFloat(0, _data.SplitValue, _data.DissolveDuration);

    ActivateAura(true);
    yield return CoroutineRef.GetWaitForSeconds(_data.AuraDuration);
    ActivateAura(false);

    foreach (GameObject go in goList)
    {
        go.SetActive(false);
    }
}

 

 

오늘의 이슈 / 내일 할 것

오늘 이슈

- 문제 : 파괴 가능 오브젝트를 처리하는 것 -> Idamageable 인터페이스로 처리할지?

- 해결 : IDamageable의 필요 없는 다른 메서드들도 상속받기 때문에 IInteract 인터페이스를 따로 만들어서 구현

foreach (RaycastHit hit in hits)
{
    damageable = hit.collider.GetComponent<IDamageable>();
    if (damageable != null)
    {
        EnemyController enemyController = hit.collider.GetComponentInParent<EnemyController>();
        EnemyStatHandler statHandler = enemyController.StatHandler;

        targetSO = statHandler.Data;
        damageable = statHandler;

        enemyController.StateMachine.Knockback(_modelTrans.forward, _playerSO.KnockbackPower);

        Attack(_playerSO, targetSO, damageable);
        return;
    }

    IInteract interactable = hit.collider.GetComponent<IInteract>();
    if (interactable != null)
    {
        Attack(interactable);
    }
}

 

 

내일 할 것

- 변이 컷씬 보여주기

 

 

오늘의 회고

  오늘은 어제 만든 쉐이더 효과를 스크립트에서 제어하도록 했고 그 과정 중에 코루틴을 사용했다. 코루틴에서 WaitForSeconds라는 함수를 반환할 수 있는데 매번 new 하면 GC가 많이 쌓이니 CoroutineRef라는 클래스를 만들어 딕셔너리에 호출된 WaitForSeconds들을 등록하는 딕셔너리를 필드로 놓고 반환해주는 메서드를 만들었다. 내일도 열심히 해보자 파이팅!

진행한 것들

Dissolve

Shader Graph를 이용하여 Dissolve 효과를 만들었다.

 

Aura

Shader Graph를 이용하여 Aura 효과를 만들었다.

 

 

오늘의 이슈 / 내일 할 것

오늘 이슈

Dissolve 버그

 Dissolve 효과를 만드는데 무기가 뿅하고 바로 생겨버리는 문제가 있었다.

 

원인 : Alpha로 가는 Noise 텍스처에 UV맵을 입혀주지 않아서 생긴 문제였다.

해결 : UV Position 노드를 불러와 텍스처에 입혀주었다.

 

 

내일 할 것

- 변이 될 때 이벤트로 무기가 나타나게 하고 이후에 아우라 효과 보여주기

- 추가로 카메라 연출이나 타임라인으로 컷씬 제작하는 것 고려(기획)

 

 

오늘의 회고

  오늘은 쉐이더 그래프를 이용하여 Dissolve 효과와 Aura 효과를 제작하였다. 변이가 핵심 기능이니만큼 연출적으로 많이 보여주어야 한다고 생각해서 만들게 되었다. 이후에는 튜토리얼처럼 변이을 한 번씩 테스트 할 수 있는 씬을 만들고 이후에 하나씩 변이 기능을 얻어가면서 플레이 할 수 있도록 해야겠다. 내일도 파이팅!

 

진행한 것들

전체 기획 피드백

멘토링 시간에 전체 기획을 피드백 받게 되었다.

3D 플랫포머 게임으로 장르를 정한 것과 액션 게임에 대한 장르적 연출이 부족하다고 들었다.

그래서 팀원들끼리 의논해본 결과 플랫포머의 특성에 맞게 각 플랫폼과 상호작용 할 수 있는 기능들을 늘리고 액션 게임에서의 속도감을 위해 캐릭터 속도 스탯을 조정하거나 공격 캔슬을 만든다던지 또는 타격 연출을 추가 한다던지 해서 조정할 생각이다.

 

 

오늘의 이슈 / 내일 할 것

오늘 이슈

- 기획 피드백

내일 할 것

- 캐릭터 스탯 조정하기

- 공격 연출 추가하기

 

 

오늘의 회고

  오늘은 기획 피드백을 받고 선택과 집중을 하게 되었다. 플랫포머와 액션 장르에 대한 피드백을 받았고 머리를 망치로 한 대 맞은 것처럼 부족한 부분이 드러나게 되었다. 게임의 재미를 위해 장르적 특성을 좀 더 보여줄 필요가 있어 보였다. 팀원과 얘기한대로 진행해보고 점점 나아지도록 하자. 내일도 파이팅!

+ Recent posts