728x90

오늘은 스탯 구현및 적용을 하려한다. 이것만 끝내면 이제 인벤토리를 개발할 예정이다

 

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

public enum UnitCode // 유닛 코드 정리 하려고 만든 enum
{
    Archer,
    Fighter,
    Paladin,
    Warrior,
    Wolf
}

새로 스크립트를 만들어 유닛코드를 enum 으로 정리해주고

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

public class Stat
{
   public UnitCode unitCode { get; } //유닛 코드는 바꿀 수 없게 Get만
    public string name { get; set; } //name 받고 셋팅 까지 할수있게 이하동문 
    public int maxHp { get; set; }
    public int curHp { get; set; }
    public int Damage { get; set; }
    public float moveSpeed { get; set; }
    public float AttackRange { get; set; }

    public Stat() 
    {

    }

    public Stat(UnitCode unitCode, string name, int maxHp, int Damage, float moveSpeed, float AttackRange) // Stat 유닛코드,이름,체력,데미지,스피드,공격력 설정을위해 
    {
        this.unitCode = unitCode; // 입력받은 것들로 바꾸기위해 대입 이하동문
        this.name = name;
        this.maxHp = maxHp;
        curHp = maxHp;
        this.Damage = Damage;
       
        this.moveSpeed = moveSpeed;
        this.AttackRange = AttackRange;

    }

    public Stat SetUnitStat(UnitCode unitCode) // 유닛코드에 따라 설정해주기위해 
    {
        Stat stat = null;

        switch(unitCode) // 유닛코드 로 스위치 문 분별
        {
            case UnitCode.Warrior: // 유닛코드가 Warrior 면 
                stat = new Stat(unitCode,"Warrior",150,30,5f,3f); //유닛코드,이름,체력,데미지,사거리,이동스피드  이하동문
                break;
            case UnitCode.Fighter:
                stat = new Stat(unitCode, "Fighter", 130, 40, 6f, 3f);
                break;
            case UnitCode.Paladin:
                stat = new Stat(unitCode, "Paladin", 200, 15, 4.5f, 3f);
                break;
            case UnitCode.Archer:
                stat = new Stat(unitCode, "Archer", 100, 50, 6f, 15f);
                break;
            case UnitCode.Wolf:
                stat = new Stat(unitCode, "Wolf", 200, 10, 6f, 3f);
                break;
        }
        return stat;
    }

}

새로 스크립트를 만들어 스탯 구현 을 해주고 

 

   public UnitCode unitCode; // 유닛코드 설정을위해 선언 
    public Stat stat; // 스탯을받아오기위해 
     private void Awake()
    {
        stat = new Stat();// 스탯 뉴 스탯 
        stat = stat.SetUnitStat(unitCode); // 스탯에 SetUnitStat 호출 (유닛코드로 구별하여) 유니티에서 wolf 로 설정해주면됨 
       
    }
    
    IEnumerator OnDamage() // ondamage코루틴 
    {
        targetIndistance = Physics.OverlapSphere(transform.position, 20f, targetmask); // 20f 안에 player 타겟마스크 콜라이더 받기 
        myTarget = targetIndistance[0].gameObject; // player 는 하나밖에없기때문에 0 번을 내타겟으로설정 
        if (myTarget != null) // 내타겟이 null 이 아니면 
        {
            ChangeState(State.BATTLE); // 배틀모드로 넘어가게 
            
        }
        myrenderer.material.color= Color.red; // 몬스터 색깔 빨강으로 변경 
        yield return new WaitForSeconds(0.2f); // 0.2 초 기다린뒤 
        if(stat.curHp>0)// 현재 hp 가 0보다크다면 
        {
            myrenderer.material.color = new Color(1, 1, 1); //원래색깔로 
           
            characterManger.fixTarget = true; //만약 맞았는데 현재 hp 가 0보다크면  타겟 고정을 위해 스탑 코루틴 켜줄 bool 조정 
        }
        if (stat.curHp <= 0)//현재 hp 가 0보다 작다면
        {
            ChangeState(State.DIE);
        }

    }

이런식으로 구현을 해준다 .

 

유닛코드를 퍼블릭으로 설정하게되면

 

이런식으로 코드를 설정해줄수있다

 public Stat stat; // 스탯 받아오기위해 
    public UnitCode unitCode; // 유닛코드 설정을 위해 
     void Awake()
    {
        stat = new Stat();// 스탯 뉴 스탯 
        stat = stat.SetUnitStat(unitCode); // 스탯에 SetUnitStat 호출 (유닛코드로 구별하여) 유니티에서 wolf 로 설정해주면됨 
        myanim = GetComponent<Animator>();
        
        CanMove = true;
       
      
    }
     private void OnTriggerEnter(Collider other)
    {
        if(other.tag == "EnemyAttack") // 닿은 콜리더 tag가 EnemyAttack 일때 
        {
            if (!isDamage) // 무적시간 이 끝났을때 
            {

                int dmage = other.GetComponentInParent<Monster>().stat.Damage; // 몬스터 데미지 얻어와서 hp - 해줄려고
                stat.curHp -= dmage;
                Debug.Log("Hitplayer"); // 확인용 
                StartCoroutine(Ondamage()); // 코루틴시작 
               
            }
        }
    }

 

이런식으로 적용해줬고 모든 스피드 및 hp 공격사거리도 다변경해줬고

 

IEnumerator AttackMove()
    {
        while(true)
        {
            this.transform.position = Vector3.MoveTowards(this.transform.position, myTarget.transform.position, Time.deltaTime * stat.moveSpeed); // 이동
            yield return null;
        }
       
      
    }
    public void OnclickAttackButton()
    {
        if(myanim.GetBool("IsAttack")==false)//파라메터 IsAttack false 일때 실행
        {
            if (targetIndistance != null) // 첫클릭시 주위에 적이 있다면 
            {
                ChangeState(State.BATTLE); //배틀모드로 바꿔주고 

            }
            if (myTarget != null) //배틀모드일때 타겟이 null이 아니라면 
            {
                CanMove = false; // 움직임제한
                if(myTarget !=null) // 내타겟이 null 이 아니라면 
                {
                    float dist = Vector3.Distance(this.transform.position,myTarget.transform.position);  // 거리값을구해서
                    if(dist>stat.AttackRange) // 거리값이 공격사거리보다 크다면 
                    {
                       StartCoroutine(AttackMove());
                        if(dist<=stat.AttackRange) // 거리값이 공격사거리 보다 작거나 같다면 
                        {
                            StopCoroutine(AttackMove());
                            myanim.SetTrigger("Attack"); // 어택 트리거 활성화 
                            transform.LookAt(myTarget.transform); // 타겟바라보게 
                        }

                    }
                }
               
            }
           


        }



    }

 

어택도 바꿔줬다.

 

이런식으로 스탯 은 적용했고 

 

인벤토리 및 장비 구현 , 퀵슬롯 구현 , 스킬 구현 , 장비드랍 , 퀘스트 ,장비상점 등이 남아있는거같다.

 

오늘은 컨디션이 안좋은지 아침부터 머리가 아파서 여기 까지만 구현하고 내일 인벤토리 구현 할 예정이다.

 

이게 ui 같은거는 많이 해봐서 빠르게 진행 가능한데 캐릭터 부분은 이번이 처음 하는거라 배워야할게 많고 검색할게 많아서 진행이 많이 못한거 같아서 아쉽다 인벤토리나 퀵슬롯 스킬 장비드랍 퀘스트 인벤토리도 구현은 해봤지만 완벽하지않아서 구현하는데 좀 걸릴거 같고 아직도 많이 부족 한거 같다. 

반응형