01/26 본캠프 #24

guno park·2024년 1월 26일
0

본캠프

목록 보기
24/77
post-custom-banner

팀 프로젝트

몬스터 만들기

이번 팀 프로젝트에 사용되는 스프라이트가 마리오라서 마리오에 나오는 몬스터들을 원작 특성대로 구현해보려고 했다.
만들기 어려웠던 것들을 풀어보자.

김수한무 만들기

김수한무는 공중에서 일정한 Y값을 가지고 마리오를 쫒아온다.
그래서 우리 프로젝트에서는 특정 포인트를 왕복하는 그런 몬스터로 만들고자 했다.

이동 구현하기

이동을 구성하는데 있어 가장 어려웠던 점은 '일정 시간마다 이동'하게 하는 것이다.
다른 몬스터들처럼 Update구문에서 처리하는 방법도 있지만, 코루틴을 사용해서 해보고 싶었다.
지정된 두 위치를 왕복하게 하기 위해서 일정 시간마다 이동할 위치를 정하고, 코루틴으로 이동하게 한다.

---스크립트1---
void FixedUpdate(){
 currenttime += Time.fixedDeltaTime;
            isAttacking = false;
            Vector2 direction = Vector2.zero;
            direction=DirectionToTarget();
            if (currenttime > movingTime)
            {
                CallMoveEvent(direction);
                Rotate(direction);
                currenttime = 0;
            }
            if (Getdistance() < AttackRange)
            {
                Rotate(direction);
                CallLookEvent(direction);
                isAttacking = true;
            }
}
---스크립트2---
 IEnumerator GetMoving(Vector3 pos)
    {
        if (Mathf.Abs(pos.x - this.transform.position.x) < 0.1f) 
            {
            this.transform.Translate(transform.position.x, transform.position.y, 0);
      		yield return new WaitForFixedUpdate();
            }
            else yield break;        
    }

하지만 이렇게 작성하거나, 이 코드를 기반으로 덧붙이면 문제가 생긴다.
1. deltatime이 없을 경우 = 순간이동
2. deltatime이 있을 경우 = 찔끔찔끔 위로 올라감.

이 문제는 transfomr.Translate를 잘못 사용해 생기는 문제다.
Translate는 주어진 벡터값을 현재의 transform.position에 더해주는 방식이다. 그러므로 일정한 y값을 유지하려면 y를 0으로 넣어주어야 할 것이다.
하지만 필자는 y축으로의 이동도 고려하고 있어 다른 방법을 사용하기로 했다.

트러블 슈팅

 IEnumerator GetMoving(Vector3 pos)
    {
        while (true)
        {
            if (Mathf.Abs(pos.x - this.transform.position.x) < 0.1f) 
            {
                yield break;
            }
            transform.position = Vector3.MoveTowards(transform.position, pos,
            _monsterStatsHandler.CurrentStates.speed); 
            yield return new WaitForFixedUpdate();
        }       
    }

이동을 위해 코루틴을 메인프레임과 다르게 흘러가는 하나의 FixedUpdate로 만들어주고, 목표하던 지점 근처에 갔을 경우에만 코루틴을 정지해 이동을 멈추게 만들어주었다.
이동방법으로는 MoveTowards를 사용했는데, 현재 위치에서 목표위치까지 지정된 속력으로 이동하게 하는 것이다.

기존에 사용하던 속도값으로는 프레임단위 이동을 따라 갈 수 없어서 속도를 엄청 낮췄지만, 작성해보며 생각하니 속도에 Time.Fixeddeltatime을 곱해주면 해결된다!
TIL을 작성하면서 떠올라서 적용해보니 잘 되는 것을 확인했다.

여러가지 이동방법 알아보기

폭탄병 만들기

이렇게 생긴 친구를 마리오를 플레이하다보면 한번쯤은 봤을 것이다.
이 몬스터의 특징은, 일정거리 이내로 접근 했을 때 점화되 일정 시간 후 터지며 범위 피해를 입힌다.

게임에서도 이를 구현하기 위해 Circle 콜라이더를 트리거 설정하여 범위내에 들어오면 기폭되게 구성하였다.

 private void OnTriggerEnter2D(Collider2D collision)
    {
        GameObject receiver = collision.gameObject;
        if (!receiver.CompareTag(targetTag))
        {
            return;
        }
        CallAttackEvent(1); //1은 의미없음. 현재 공격데이터가 없음  
    }

태그를 비교해 플레이어가 맞다면, 코루틴을 통해 폭발한다.

  IEnumerator Getbomb()
    {
        bool hasdamage = false;
        yield return new WaitForSeconds(1f);
        int layermask = LayerMask.GetMask("Player");
        Collider2D[] colliders = Physics2D.OverlapCircleAll(transform.position, 5f);
        for (int i = 0; i < colliders.Length; i++)
        {
            if (colliders[i].tag == "Player")
            {
                _collidingTargetHealthSystem = colliders[i].GetComponent<HealthSystem>();
                if (_collidingTargetHealthSystem == null)
                {
                    break;
                }
                else
                {
                    hasdamage = true;    
                }
            }
        }
        if (hasdamage) 
        {
            ApplyHealthChange();
        }
        gameObject.SetActive(false);
    }

여기에 사용된 Physics2D덕분에 좀 힘들었는데, 결국 튜터님께 여쭤보고 풀었다.
이전에 사용한 속성은 Physics.OverlapSphere(중심점,반지름,검색할 레이어마스크)
중심점을 기준으로 반지름만큼의 가상의 구를 펼쳐, 그 내부에 존재하는 콜라이더를 배열로 반환한다.
이렇게 설명하다보니 이상한 점이 보이는 데, 바로 구를 펼친다는 것이다.

현재 만들고 있는 게임은 2D게임으로 3차원 물체인 구가 존재할 수 없다.
고로 같은 계통의 2d용 속성인 Physics2D.OverlapCircle을 사용해야 한다.

똑같이 펼치고 받아오는데 Physics2D.OverlapCircle는 콜라이더를 하나만 반환하기 때문에 원하는 것을 검출하고자 한다면 레이어 마스크를 꼭 사용해야하고,
Physics2D.OverlapCircleAll을 이용한다면 3d일때와 마찬가지로 배열 로 반환할 수 있다.

몬스터 겹치게하기

몬스터를 겹치게하려면 몬스터의 콜라이더에서 Layer Overrides를 수정해주어야한다.

이 4개를 겹치지 않게 하고 싶은 것만 체크하고 나머지는 풀어두면 몬스터가 겹치게 된다.

내일 할 일

  1. 몬스터 공격 시 player HP 감소하게 하기 (몇몇은 하는데 나머지는 안함)
  2. 몬스터 2개 추가하기
  3. 김수한무 길 넣어주는 스크립트 만들기(SkyWayManager)
post-custom-banner

0개의 댓글