게임개발/언데드서바이벌_골드메탈_클론코딩

[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 14 (플레이 캐릭터🧑‍🤝‍🧑선택 )

메카인 2023. 5. 11. 17:25

https://www.youtube.com/watch?v=vJACbWBDa90&list=PLO-mt5Iu5TeZF8xMHqtT_DhAPKmjF6i3x&index=18 


1. 캐릭터 선택 UI

UI의 새로운 빈 오브젝트를 생성

- Canvas > GameStart > 우클릭 > Creat Empty (Character Group)

+세부 조정

Grid Layout Goup : 자식 오브젝트를 그리드 형태로 정렬하는 컴포넌트

- Cell Size 50 50 , Spacing 1 1

시작 버튼을 자식 오브젝트로 넣기(이름 변경 Character 0)

버튼에 Image 추가

Image 0 할당(y8)

캐릭터 선택 버튼으로 편집(Text Name etc)

버튼과 Text의 Outline의 색을 변경

완성한 버튼을 Ctrl + D로 복사하여 다른 캐릭터로 편집


2. 선택 적용하기

GameManager.cs 에서 캐릭터 ID를 저장할 변수 선언

    [Header("# Player Info")]
    public int playerId;
    
        public void GameStart(int id)
    {
        playerId = id;
        maxHealth = 100;
        health = maxHealth;

        uiLevelUp.Select(playerId % 2);    //임시 스크립트 (첫번째 캐릭터 선택)

        Resume();
    }

- 게임 시작 함수에는 int 매개변수 추가

- 기본무기 지급(임시 스크립트)을 위한 함수 호출에서 인자 값을 캐릭터ID로 변경

 

플레이어 오브젝트는 미리 비활성화

 

게임 시작할 때 플레이어 활성화 후 기본 무기 지금

    public void GameStart(int id)
    {
        playerId = id;
        maxHealth = 100;
        health = maxHealth;

        player.gameObject.SetActive(true);
        uiLevelUp.Select(playerId % 2);    //임시 스크립트 (첫번째 캐릭터 선택)

        Resume();
    }

- % 2 : 에러 발생 방지용

 

https://www.youtube.com/watch?v=vizfd1TeRMI 

 

플레이어 스크립트에 여러 애니메이터 컨트롤러를 저장할 배열 변수 선언

public RuntimeAnimatorController[] animCon;

 

일단 두개로 진행

 

Player.cs OnEnable 함수 추가 후, 애니메이터 변경 로직 추가

    private void OnEnable()
    {
        anim.runtimeAnimatorController = animCon[GameManager.instance.playerId];
    }

 

GameManager 캐릭터 선택 버튼의 게임시작 함수를 재연결

0은 0으로 1은 1으로


3. 캐릭터 특성 로직

캐릭터 특성을 관리하는 새로운 스크립트 생성(Character)

public class Character : MonoBehaviour
{
    public static float Speed
    {
        get { return GameManager.instance.playerId == 0 ? 1.1f : 1f; }
    }

- 함수가 아닌 속성을 작성

- 삼항연산자를 활용하여 캐릭터에 따라 특성치 적용

 

Player.cs

    private void OnEnable()
    {
        speed *= Character.Speed;
        anim.runtimeAnimatorController = animCon[GameManager.instance.playerId];
    }

- 스피드 곱연산

- 평소 많이 활용한 클래스들의 속성들도 이런 방식으로 작성되어 있어요

 

Gear.cs

    void SpeedUp()
    {
        float speed = 3 * Character.Speed;
        GameManager.instance.player.speed = speed + speed * rate;
    }

- 스피드 곱연산

 

Character.cs 캐릭터 특성치에 맞는 각종 속성들을 작성

public class Character : MonoBehaviour
{
    public static float Speed
    {
        get { return GameManager.instance.playerId == 0 ? 1.1f : 1f; }
    }
    public static float WeaponSpeed
    {
        get { return GameManager.instance.playerId == 1 ? 1.1f : 1f; }
    }
    public static float WeaponRate
    {
        get { return GameManager.instance.playerId == 1 ? 0.9f : 1f; }
    }
    public static float Damage
    {
        get { return GameManager.instance.playerId == 2 ? 1.2f : 1f; }
    }
    public static int Count
    {
        get { return GameManager.instance.playerId == 3 ? 1 : 0; }
    }

}

 

나머지 연사속도 적용

Weapon.cs

    public void Init(ItemData data)
    {
        //...
        switch (id)
        {
            case 0:
                speed = 150 * Character.WeaponSpeed;
                Batch();
                break;
            default:
                speed = 0.3f * Character.WeaponRate;
                break;
        }

Gear.cs

    void RateUp()
    {
        Weapon[] weapons = transform.parent.GetComponentsInChildren<Weapon>();

        foreach(Weapon weapon in weapons)
        {
            switch (weapon.id)
            {
                case 0:
                    float speed = 150 * Character.WeaponSpeed;
                    weapon.speed = 150 + (150 * rate);
                    break;
                default:
                    speed = 0.5f * Character.WeaponRate;
                    weapon.speed = 0.5f * (1f - rate);
                    break;
            }
        }
    }

 

데미지 상승, 갯수 증가

Weapon.cs

    public void Init(ItemData data)
    {
        // ...


        // Property Set
        id=data.itemId;
        damage = data.baseDamage * Character.Damage;
        count = data.baseCount + Character.Count;
    }
    
    public void LevelUp(float damage, int count)
    {
        this.damage = damage * Character.Damage;
        this.count += count;
        //...
    }

깃허브 올리기

Commit : ver 1.13
Description : Play Character Select

 

https://github.com/mekain80/CloneCode_Undead_Survivor

 

GitHub - mekain80/CloneCode_Undead_Survivor: https://www.youtube.com/watch?v=MmW166cHj54&list=PLO-mt5Iu5TeZF8xMHqtT_DhAPKmjF6i3x

https://www.youtube.com/watch?v=MmW166cHj54&list=PLO-mt5Iu5TeZF8xMHqtT_DhAPKmjF6i3x&index=1 - GitHub - mekain80/CloneCode_Undead_Survivor: https://www.youtube.com/watch?v=MmW166cHj54&li...

github.com