TIL - 심화 팀 프로젝트 4일차

Amberjack·2024년 2월 29일
0

TIL

목록 보기
50/83
post-thumbnail

24.02.29 심화 팀 프로젝트 4일차

맙소사. 오늘은 코딩을 하다 날을 넘겨버렸다... 그래서 사실 3월 1일에 쓰는 TIL이다...

오늘의 문제

오늘은 문제가 정말 정말 많았다. 몬스터의 애니메이션이 제대로 동작하지 않는 문제가 너무나도 컸다. 몬스터의 애니메이션이 종료된 후의 처리를 해주기 위해 애니메이션 재생 종료 시를 콜백받으려고 했으나, 이를 위해 사용한 animator.GetCurrentAnimatorStateInfo(0).IsName, animator.getcurrentanimatorstateinfo(0).normalizedtime 두 함수 모두 동작을 지 멋대로 해서 콜백을 받아올 수가 없었다. 분명 내가 원하는 애니메이션이 재생중인데도 불구하고 IsName으로 비교를 해도 false를 반환하고, normalizedtime >= .9f를 통해 현재 재생중인 애니메이션이 종료했는지를 비교해도 false를 반환하니 그냥 미쳐 팔짝 뛸 노릇이다.

일단은 임시 방편으로 Animation에 Add Event를 하여 애니메이션의 끝 프레임에서 Event를 호출하는 것으로 콜백을 받았다.

해야 할 일

이번 삼일절, 주말동안 할 일이 너무나 많다. 몬스터 길찾기, 보스 몬스터 만들기, 몬스터 랜덤 생성하기 등등...

일단 현재 Tilemap에 오브젝트가 있는 지 확인하는 코드를 작성을 해놓기는 했는데, 이를 활용해서 몬스터의 길찾기 알고리즘을 작성할 수 있을까? 난 모르겠다.

using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Tilemaps;

public class TileManager : SingletoneBase<TileManager>
{
    public Dictionary<Vector3Int, bool> isObjectOnTile = new Dictionary<Vector3Int, bool>();
    public Tilemap tilemap;
    public Transform Player {  get; private set; }

    public event Action OnTilemapInfoSet;

    void Start()
    {
        GameManager.I.OnTilemapReady += InitTilemapInfo;
        Player = GameObject.FindGameObjectWithTag("Player").transform;
    }

    void Update()
    {
        
    }

    public void InitTilemapInfo()
    {
        tilemap = GameObject.FindGameObjectWithTag("Tilemap").gameObject.GetComponent<Tilemap>();
        isObjectOnTile.Clear();

        foreach (Vector3Int pos in tilemap.cellBounds.allPositionsWithin)
        {
            if(!tilemap.HasTile(pos)) continue;

            var tile = tilemap.GetTile(pos);

            isObjectOnTile.Add(pos, false);
        }

        SetTilemapInfo(Vector3Int.FloorToInt(Player.transform.position));
    }

	// 오브젝트 생성, 움직였을 때 현재 자리의 상태를 true로 설정하기
    public void SetTilemapInfo(Vector3Int pos)
    {
        if(isObjectOnTile.ContainsKey(pos))
        {
            isObjectOnTile[pos] = true;
        }
    }
    
    // 오브젝트가 움직였을 때, 현재 있던 자리의 상태를 false로 변경하기
	public void ReleaceTilemapInfo(Vector3Int pos)
	{
    	if (isObjectOnTile.ContainsKey(pos))
    	{
        	isObjectOnTile[pos] = false;
    	}
	}

    public bool HasObjectOnTile(Vector3Int pos)
    {
        if(isObjectOnTile.ContainsKey(pos)) return isObjectOnTile[pos];
        return false;
    }
}

일단 InitTilemapInfo()에서 tilemap을 받아온다. 이후 foreach문에서 tilemap의 모든 포지션 안에서 pos라는 위치에 타일맵이 있는지 확인을 하고, 있다면 isObjectOnTile이라는 딕셔너리에 pos를 키 값으로 집어 넣어준다. 이후 SetTilemapInfo에서 오브젝트가 생성되었을 때 isObjectOnTile에 현재 위치를 등록해주는 것으로 설정해줄 수 있다. 이를 통해 어떤 오브젝트가 어떤 타일로 이동하려 할 때, 그 타일에 오브젝트가 있는지 확인하여 겹쳐지지 않도록 처리해줄 수 있을 것이다. 내 예상으로는.

오늘의 회고

오늘은 힘들다. TIL을 쓰고 있는데 1시가 넘었다. 그런데 아직도 할일이 많다니... 흑흑 턴제 너무 힘들다! 다음에는 좀 더 설계를 완벽하게 해서 턴 관리를 신경써서 설계해야겠다.

0개의 댓글