이번 포스팅은 좀 간단할 듯 하네요.


건물 버프 기능과 캐릭터와의 상호작용 부분입니다.

내용 자체는 기획에 따라 변경될거라 별거 없지만, Facility에 대해 짚고 넘어가고자 진행합니다. 


아래와 같은 것을 만드는 겁니다. 



(화면상에 눈에 보이는게 없어서 급조해서 만든 Text와 머리만 있는 캐릭터가 참... 없어보이네요. )

 현재는 캐릭터가 지정된 타일로 이동해서 타일의 시설을 사용하고 되돌아오는 테스트 코드만 작성된 상태입니다. (캐릭터는 길찾기 및 사용할 시설 선택 로직까지 구현하고, 아마 다음 포스팅에 올리겠습니다. 캐릭터 몸통과 애니메이션도 그때 같이 진행할 예정입니다.)


이번에는 간단하게 Facility를 어떻게 구조를 잡았고, 어떤 것을 하는지만 얘기하겠습니다.

딱 기본이 될 정도만 하다보니 빈 함수도 많고, 구현내용이 많지가 않아요. (기획에 따라 계층구조를 다시 생각해 볼 필요도 있겠네요...)


우선 Facility


public abstract class Facility { public FacilityType type; public Sprite facilitySprite; protected GameObject facilityObj; float useTime = 4.0f; int useAnimation = 0; protected Tile positionTile; public float getUseTime() { return useTime; } public int getUseAnimaion() { return useAnimation; } public void CreateFacility(Tile tile) { GameObject obj = new GameObject("facility"); obj.transform.SetParent(tile.GetTileObject().transform); obj.AddComponent<SpriteRenderer>().sprite = facilitySprite; obj.transform.localPosition = new Vector3(0, 0.5f, -1); facilityObj = obj; positionTile = tile; MakeFacility(); } public abstract bool isEmpty(); public abstract bool isNull(); public abstract void ApplyBuff(Dictionary<BuffType, int> buffList); public abstract void MakeFacility(); public abstract bool InteractWithCharacter(Character character); public abstract void ExitFacility(); }


각 함수와 필드에 대해 간단히 설명하겠습니다.


useTime - 캐릭터가 들어와서 사용시 사용할 시간.

useAnimation - 캐릭터가 사용시 플레이될 애니메이션 번호 ( 애니메이션은 캐릭터가 개별적으로 가지고, 건물 사용시 마크된 애니메이션을 플레이 시킬 예정입니다.)


isEmpty - 향후 캐릭터가 이동할 건물을 검색할 시 사용될 건물이 비었는지 판별 함수.

isNull - NullFacility 구별용

ApplyBuff - 매개변수를 통해 전달된 버프를 이용해 시설의 데이터를 변경하는 함수. (버프는 타일이 가지고 있다가 건물이 설치되면 건물에 전달.)

MakeFacility - 건물 설치시 하위 클래스가 해야하는게 있으면 할 함수.

InteractWithCharacter - 건물을 사용하는 캐릭터와 상호작용 

ExitFacility - 캐릭터가 나갈시 호출 함수.



그리고 Facility를 상속받아 NullFacility, EtcFacility, SellFacility, GymFacility, DecoFacility가 만들어집니다.

(NullFacility는 Null체크 회피를 위한 클래스일 뿐이라 제외하겠습니다.)


판매점 클래스인 SellFacility 입니다.

public class SellFacility : Facility { public int fame = 0; public int originPrice = 100; public int price; Character user; string textPoolName = "TextPool"; public SellFacility(FacilityType _type) { type = _type; facilitySprite = SpriteManager.Instance.getFacilitySprite(_type); price = originPrice; } public override bool isNull() { return false; } public override void ApplyBuff(Dictionary<BuffType, int> buffList) { if (buffList.ContainsKey(BuffType.Envir)) { fame = buffList[BuffType.Envir]; ShowMoveText("Fame " + buffList[BuffType.Envir]); } if (buffList.ContainsKey(BuffType.Price)) { price = originPrice + buffList[BuffType.Price]; ShowMoveText("Price " + buffList[BuffType.Price]); } Debug.Log("fame = " + fame + " price = " + price); } private void ShowMoveText(string _text) { MoveText textObj = PoolManager.Instance.getObject(textPoolName, facilityObj.transform).GetComponent<MoveText>(); textObj.setTextMessage(_text); textObj.transform.position = facilityObj.transform.position + new Vector3(0, 0, -1); textObj.gameObject.SetActive(true); } public override void MakeFacility() { } public override bool InteractWithCharacter(Character character) { user = character; if (user.isEmptyMoney(price)) { user.addMoney(-1 * price); } return false; } public override bool isEmpty() { return user == null; } public override void ExitFacility() { user = null; } }


아래의 GymFacility와 비슷해서 밑에서 같이 설명하겠습니다. 


체육관 유형 클래스인 GymFacility

public enum AbilityType
{
    Str,Spd
}

public class GymFacility : Facility
{
    public int fame = 0;
    AbilityType ability = AbilityType.Str;
    int abiliValue = 20;

    Character user;

    string textPoolName = "TextPool";
    public GymFacility(FacilityType _type)
    {
        type = _type;
        facilitySprite = SpriteManager.Instance.getFacilitySprite(_type);

    }
    public override bool isNull()
    {
        return false;
    }
    public override void ApplyBuff(Dictionary<BuffType, int> buffList)
    {
        if (buffList.ContainsKey(BuffType.Envir))
        {
            fame = buffList[BuffType.Envir];
            ShowMoveText("Fame " + buffList[BuffType.Envir]);
        }
        Debug.Log("fame = " + fame);

    }
    private void ShowMoveText(string _text)
    {

        MoveText textObj = PoolManager.Instance.getObject(textPoolName, facilityObj.transform).GetComponent<MoveText>();
        textObj.setTextMessage(_text);
        textObj.transform.position = facilityObj.transform.position + new Vector3(0, 0, -1);
        textObj.gameObject.SetActive(true);
    }
    public override bool InteractWithCharacter(Character character)
    {
        user = character;
        if(ability == AbilityType.Str)
        {
            user.addStr(abiliValue);
        }
        else if(ability == AbilityType.Spd)
        {
            user.addSpd(abiliValue);
        }
        return false;

    }

    public override void MakeFacility()
    {
    }

    public override bool isEmpty()
    {
        return user==null;
    }
    public override void ExitFacility()
    {
        user = null;
    }
}


ShowMoveText 함수는 화면상에 변경되는 데이터양을 표현하기 위해 급조한 함수입니다;;

그 외에 Gym과 Sell에서 구현된 함수는 ApplyBuff와 InteractWithCharacter입니다.

전달된 매개변수에 따라 데이터에 적용하고, InteractWithCharacter 는 캐릭터가 건물사용시 호출되는 함수로 건물별로 캐릭터에 데이터를 적용하고 있습니다.

MakeFacility는 아직 구현이 안되있지만 향후 캐릭터가 목표 건물을 탐색하기위해 리스트에 Add하는 코드를 구현할 예정입니다.


조형물 유형 클래스인 DecoFacility

public class DecoFacility : Facility
{
    int range;
    BuffType buffType;
    int buffValue;

    TileController tileController;

    public DecoFacility(FacilityType _type,int _range,BuffType _buffType, int _buffValue)
    {
        type = _type;
        facilitySprite = SpriteManager.Instance.getFacilitySprite(_type);

        tileController = GameObject.Find("TileController").GetComponent<TileController>();
        
        range = _range;
        buffType = _buffType;
        buffValue = _buffValue;
    }
    public override bool isNull()
    {
        return false;
    }
    public override void ApplyBuff(Dictionary<BuffType, int> buffList)
    {

    }
    public override bool InteractWithCharacter(Character character)
    {

        return false;
    }

    public override void MakeFacility()
    {
        int posX = positionTile.GetPosX();
        int posY = positionTile.GetPosY();

        tileController.SetTileBuff(range, posX, posY, buffType, buffValue);
    }
    public override bool isEmpty()
    {
        return false;
    }
    public override void ExitFacility()
    {
    }
}
TileController  
  public void SetTileBuff(int range, int posX, int posY, BuffType type, int value)
    {
        for(int i = -range; i <= range; i++)
        {
            for(int j = -range; j <= range; j++)
            {
                if (i == 0 && j == 0) continue;

                int _x = posX + j;
                int _y = posY + i;
                if (isRangeOut(_y, _x)) continue;

                tiles[_y, _x].AddBuffList(type, value);
            }
        }

    }


 조형물은 주요 역할이 주변 건물에 버프를 주는 것입니다. 때문에 주변 타일에 자신의 버프를 적용하고 있습니다.

 버프는 우선 타일에 적용되고, 타일은 버프가 변경될 때마다 Facility에 적용하는 함수를 호출해줍니다.


그 외 Facility ( 현재는 캐릭터의 집을 나타냅니다.)

public class EtcFacility : Facility
{
    Character master;

    bool isUse = false;
    int recovery = 10;

    public EtcFacility(FacilityType _type)
    {
        type = _type;
        facilitySprite = SpriteManager.Instance.getFacilitySprite(_type);

    }
    public override bool isNull()
    {
        return false;
    }

    public override void ApplyBuff(Dictionary<BuffType, int> buffList)
    {

    }
    public override bool InteractWithCharacter(Character character)
    {

        character.addHp(recovery);

        return !character.isFullHp();

    }
    
    public override void MakeFacility()
    {
    }

    public override bool isEmpty()
    {
        return isUse;
    }
    public override void ExitFacility()
    {
        
    }
}



음....쓰고나니 더 별 내용이 없네요...간단한데도 불구하고 포스팅이 늦었는데...흠... 앞으로 더 늦어질수도 있습니다;;;

안드로이드 쪽을 너무 공부를 안하고 있었어서, 최근에 다시 들여다보면서 안드로이드 네이티브 앱도 같이 개발을 좀 연습하다보니...


이번에는 캐릭터 클래스는 설명이 없는데, 다음 포스팅에서는 캐릭터 건물 탐색 및 길찾기로 캐릭터 구현을 진행하게 될테니 같이 설명하겠습니다.

Posted by 검은거북

블로그 이미지
프로그래밍 공부 요약 및 공부하며 발생한 궁금증과 해결과정을 포스팅합니다.
검은거북

공지사항

Yesterday
Today
Total

달력

 « |  » 2025.1
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

최근에 올라온 글

최근에 달린 댓글

글 보관함