오늘은 팀원과의 회의를 통해 정해졌던 적 구현 파트를 진행했다.

주말동안 작업했던 내용을 깃허브에 올리고 팀원들과 공유를 하면서 하루를 시작했다.

우선 주말에 구현한 내용들은 적 몬스터 만들기, 적을 짜여진 동선으로 이동하게 만들기

스폰지점 생성, 임시)라운드 구현, 등이있다.

덕분에 할 일이 없어진 나는 오늘...

 

적 몬스터는 SO를 사용해서 데이터 관리를 해주었고

 

다음은 적의 이동 동선인데 적에게 콜라이더, 리지드바디를 줘서 충돌시 방향 돌려주면 된다는

생각을 가지고 있었기 때문에 코드만 짜면 되는 일이였다.

근데 생각만큼 잘 나오지 않아서 혼자 고민하다가 같이 스터디를 하는 동기들에게 도움을

구하여 해결했다.

Quaternion.AngleAxis(); 라는 유니티 엔진 메서드를 이용해보라고 알려줘서 바로 사용한결과 

원하는 대로 잘 작동하게 되었다.

//시작시 아래로 내려감
Vector3 dirVec = new Vector3(0f, -1f, 0f);

private void OnCollisionEnter2D(Collision2D collision)
{
    if (collision.collider.CompareTag("Wall"))
    {
        print("충돌!");
        //충돌시 이동방향 왼쪽으로 90도 돌리기
        dirVec = Quaternion.AngleAxis(90f, Vector3.forward) * dirVec;
        //바라보는 방향 변경
        collCount++;
        if (collCount % 2 == 0)
        {
            _spriteRenderer.flipX = !_spriteRenderer.flipX;
            collCount = 0;
        }
    }
}

 

스폰지점은 SpawnPoint를 만들어두긴 했는데 적용할려고 이런저런 테스트할때

그냥 프리팹의 위치를 시작시 생겨야 하는 지점으로 설정하니깐 생성이 되버렸다.

그래서 암튼 해결 했고

 

라운드를 제작하는 게 밸런스에 관여되는 부분이라 일단 임시로 만들었는데

코루틴을 사용하여 작성해 보았다.

 

 void Start()
 {
     StartCoroutine("StartRound");
 }

 public IEnumerator StartRound()
 {
     RoundClear();
     yield return new WaitForSeconds(2f);

     for (int i = 0; i < roundPerSpawn; i++)
     {
         GameObject enemy = Instantiate(enemy1);
         //position일줄 알았는데 그냥 부모로 되서 enemy1들이 자식으로 만들어짐...
         enemy.transform.parent = spawnPoint;
         yield return new WaitForSeconds(spawnInterval);
     }
 }

 void RoundClear()
 {
     //TODO 클리어 메세지 출력
     //진행 라운드 메세지 출력
     round++;
     roundPerSpawn += 5;
     enemyCount = roundPerSpawn;
 }

 

아직은 임시라 언제든 수정가능한 범위 내에서만 만들어 놓고 테스트를 진행했었다.

 

그리고 오늘은 손이 비어서 그냥 체력바까지 만들었는데

Image를 누르고 Inspector창을 보면 Source Image에 sprite를 넣을 수 있는데

넣으면 바로 아래에 Image type이 생기고 simple로 되어있는 창을 누르면 여러가지

선택할 수 있게 된다.

그곳에서 Filled를 선택 하면 관련 기능이 추가되는데 순서대로 Horizontal, Left를

설정하고 아래 수치 조절을 해보면 실제 게임에서 보던 체력바 기능처럼 보여진다.

더욱 있어보이게 만들려면 같은캔버스 아래에 같은크기의 이미지를 하나 더

추가해준뒤 앞서 만들어둔 Image를 초록색 다른 하나는 빨간색으로 하면 더욱 실감난다.

그리고 코드 작성을 좀 해주면 된다.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;


[System.Serializable]
public class Condition
{
    [HideInInspector]
    public float curValue;
    public float maxValue;
    public Image uiBar;


    public float GetPercentage()
    {
        return curValue / maxValue;
    }

}


public class Enemy : MonoBehaviour
{
    public Condition health;

    private void Start()
    {
        health.maxValue = GameManager.instance.enemyStats.enemyHealth;
        health.curValue = health.maxValue;
    }

    private void Update()
    {
        //임시
        health.curValue -= Time.deltaTime;
        if (health.curValue <= 0f) 
        {
            EnemyDie();
        }

        health.uiBar.fillAmount = health.GetPercentage();
    }

    void EnemyDie()
    {
        GameManager.instance.enemyCount--;
        GameManager.instance.enemyStats.isDead = true;
        //TODO 스폰 코루틴 수정
        if (GameManager.instance.enemyCount == 0)
        {
            GameManager.instance.StartCoroutine("StartRound");
        }
        Destroy(gameObject);
        //gameObject.SetActive(false);
    }
}

 

체력을 구현하고 나니 테스트를 해보고 싶어져서 Update부분에 시간이 흘러가면서

체력이 달게 만들어서 테스트를 진행했고

 

몬스터가 죽었을 경우를 함수로 만들어서 만들어둔 코루틴을 넣어줬는데

뭔가 살짝.. 불편한 느낌이 들어서 나중에 수정하기로 적어두었다.

그리고 몬스터(적)의 개체수가 상당히 많은 양이 될 거 같아서 오브젝트 풀을

해야되는데 아직 어려운 감이 있어서 Destory를 써놓았다.

오늘까지 구현한 내용

 

 

 

반응형