주녘공부일지

[더 챌린저스] 캐릭터 본문

GameEngine/Unity - Project

[더 챌린저스] 캐릭터

주녘 2023. 8. 4. 19:19
728x90

1. 캐릭터를 제어하는 싱글톤 클래스

- 내 캐릭터와 상대 캐릭터가 존재하기 때문에 제어권을 가진 '나의 캐릭터'만 제어하는 기능을 함

- 캐릭터를 생성하고 생성 시 Action 대리자 함수를 등록해 이벤트 발생을 감지

    public void PlayerCommand(ENUM_PLAYER_STATE nextState, CharacterParam param = null)
    {
        if (activeCharacter == null || !activeCharacter.isControl)
            return;

        switch (nextState)
        {
            case ENUM_PLAYER_STATE.Idle:
                activeCharacter.Idle();
                break;
            case ENUM_PLAYER_STATE.Move:
                activeCharacter.Move(param);
                break;
            case ENUM_PLAYER_STATE.Dash:
                activeCharacter.Dash();
                break;
            case ENUM_PLAYER_STATE.Jump:
                activeCharacter.Jump();
                break;
            case ENUM_PLAYER_STATE.Attack:
                activeCharacter.Attack(param);
                break;
            case ENUM_PLAYER_STATE.Skill:
                activeCharacter.Skill(param);
                break;
            case ENUM_PLAYER_STATE.Hit:
                Debug.LogError("PlayerCommand() : Hit 명령이 들어옴");
                break;
            case ENUM_PLAYER_STATE.Die:
                activeCharacter.Die();
                break;
        }
    }

2. 캐릭터 파라미터

- 캐릭터의 상태를 변경하는 명령에 필요한 데이터를 담은 파라미터 클래스

+ Serialize(), Deserialize() : 브로드캐스트 할 때 패킷에 커스텀 클래스를 넣을 수 없어 바이트화 하기 위해 추가된 코드

[Serializable]
public class CharacterParam : PhotonCustomType { }

[Serializable]
public class CharacterMoveParam : CharacterParam
{
    public float moveDir;
    
    public CharacterMoveParam(float _moveDir)
    {
        moveDir = _moveDir;
    }
}

// 기본공격, 점프공격
[Serializable]
public class CharacterAttackParam : CharacterParam
{
    public ENUM_ATTACKOBJECT_NAME attackTypeName;
    public bool reverseState;

    public CharacterAttackParam(ENUM_ATTACKOBJECT_NAME _attackTypeName, bool _reverseState)
    {
        attackTypeName = _attackTypeName;
        reverseState = _reverseState;
    }
    
    public new static object Deserialize(byte[] data)
    {
        string jsonData = Encoding.UTF8.GetString(data);
        return JsonUtility.FromJson<CharacterAttackParam>(jsonData);
    }
    
    public new static byte[] Serialize(object customObject)
    {
        var param = (CharacterAttackParam)customObject;
        string jsonData = JsonUtility.ToJson(param);
        return Encoding.UTF8.GetBytes(jsonData);
    }
}

// 캐릭터의 스킬 번호 ( 0 ~ 4 ) 0 : Dash
[Serializable]
public class CharacterSkillParam : CharacterParam
{
    public int skillNum;

    public CharacterSkillParam(int _skillNum)
    {
        skillNum = _skillNum;
    }
    
    public new static object Deserialize(byte[] data)
    {
        string jsonData = Encoding.UTF8.GetString(data);
        return JsonUtility.FromJson<CharacterSkillParam>(jsonData);
    }
    
    public new static byte[] Serialize(object customObject)
    {
        var param = (CharacterSkillParam)customObject;
        string jsonData = JsonUtility.ToJson(param);
        return Encoding.UTF8.GetBytes(jsonData);
    }
}

3. 캐릭터 애니메이션 제어

https://godgjwnsgur7.tistory.com/59

 

[더 챌린저스] 캐릭터 애니메이션 제어

1. 애니메이터 컨트롤러 - 복잡한 구조도를 가능한 편하게 확인하고 수정할 수 있도록 특정 모션들은 서브 머신으로 묶어서 관리 - bool 변수와 Trigger 변수로 두 번 이상 체크를 함으로써 안정성

godgjwnsgur7.tistory.com

 

728x90