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 같은거는 많이 해봐서 빠르게 진행 가능한데 캐릭터 부분은 이번이 처음 하는거라 배워야할게 많고 검색할게 많아서 진행이 많이 못한거 같아서 아쉽다 인벤토리나 퀵슬롯 스킬 장비드랍 퀘스트 인벤토리도 구현은 해봤지만 완벽하지않아서 구현하는데 좀 걸릴거 같고 아직도 많이 부족 한거 같다.
반응형
'개인프로젝트 3D RPG 개발일지' 카테고리의 다른 글
18.(유니티 포폴) 인벤토리 구현 (0) | 2022.07.06 |
---|---|
17.(유니티포폴) 인벤토리구현 (0) | 2022.07.05 |
15.(유니티포폴) 몬스터 ai 수정 및 오토타겟팅 수정 (0) | 2022.07.03 |
14.(유니티포폴) 맵구현 (0) | 2022.07.01 |
14.(유니티포폴)몬스터 ai 구현 (0) | 2022.06.30 |