728x90
IEnumerator Battle()
{
myanim.SetBool("IsRunnig", true); // 뛰어오는 애니메이션 재생을위해
while (true)
{
float distance = Vector3.Distance(transform.position, myTarget.transform.position); // 플레이어와 몬스터사이 거리 재기위함
myanim.SetBool("IsWalking", false); // walking 이 true 로 안바뀌기위해
if(distance <=20f)
{
transform.LookAt(myTarget.transform);
}
nav.SetDestination(myTarget.transform.position); // 따라가게 하기위한 코드
if (myanim.GetBool("IsAttack")==true || myanim.GetBool("IsDamage") ==true ) // 공격애니메이션 이나 데미지애니메이션 둘중하나라도 재생중이라면 움직임이 멈추고
{
nav.isStopped=true;
}
else // 아니라면 움직여라
{
nav.isStopped = false;
}
if (distance <= Attackrange) // 거리가 어택사거리 보다 짧거나 같다면
{
if (myanim.GetBool("IsAttack") == false) // 공격중이아니라면
{
myanim.SetTrigger("Attack"); //공격애니메이션 재생
StartCoroutine(Attack()); // 코루틴시작
}
}
if(distance >= 20f) // 몬스터와 캐릭터 거리 차이가 20f 가 넘으면
{
myanim.SetBool("IsRunnig", false); // 애니메이션 런 false
nav.isStopped = true; // 네비 스탑
characterManger.fixTarget =false; // 캐릭터매니저 타겟고정 false
ChangeState(State.IDLE); // idle 상태로 변경
}
yield return null;
}
}
배틀 코루틴 부분에 코드에 distance >= 20f 구절 추가
void ChangeState(State s) // State 변경
{
if (myState == s) return; // 지금 내 state 가 입력받은 state 와 같다면 return
myState = s; // 아니라면 내 state 에 입력받은 s 대입
switch(myState)
{
case State.CREATE:
break;
case State.IDLE:
StopAllCoroutines(); // 모든 코루틴을 멈추고
StartCoroutine(GoStartPos()); // 시작위치로 돌아가는 코루틴 시작
break;
case State.ROAMING:
speed = 2f;
StopAllCoroutines(); // 모든 코루틴을 멈추고
StartCoroutine(Roaming()); // 로밍 코루틴 시작
break;
case State.BATTLE:
speed = 3f; // 몬스터 스피드 3 로조정
StopAllCoroutines();
StartCoroutine(OnDamage()); // ondamage 코루틴 시작
StartCoroutine(Battle()); // 스타트 코루틴 배틀
break;
case State.DIE: // die 상태로돌입하면
myanim.SetTrigger("Dead"); // Dead 트리거 작동으로 Dead 애니메이션 나오고
StartCoroutine(Disapearing()); // Disapearing 코루틴 시작
CharacterManger characterManger = GameObject.Find("Archer").GetComponent<CharacterManger>();
characterManger.fixTarget = false;// 만약 맞았는데 현재 hp 가 0보다작거나 같다면 타겟 세팅을 위해 스타트 코루틴 켜줄 bool 조정
break;
}
}
상태변경때 코드 추가
IEnumerator GoStartPos() // 시작위치로 돌아가는 코루틴
{
myCanvas.transform.gameObject.SetActive(false); // 내 캔버스 안보이게 설정
myTarget = null; // 내 타겟 null
targetIndistance=null; // 콜리더 null
speed = 5f; //스피드 5
myanim.SetBool("IsWalking", true); // walk 애니메이션 true
while(true)
{
transform.LookAt(Startpos); // 시작포지션 바라보게
float dist = Vector3.Distance(transform.position, Startpos); // 시작포지션과 몬스터 distance
this.transform.position = Vector3.MoveTowards(transform.position, Startpos, Time.deltaTime*speed); // 시작위치로이동
if(dist<=0.1f) // 시작 위치랑 몬스터의 거리가 0.1 f 보다 작다면
{
myanim.SetBool("IsWalking", false); // walk 애니메이션 false
ChangeState(State.ROAMING); // 로밍으로변경
}
yield return null;
}
}
시작위치로 돌아가는 코루틴 추가
여기 까지 수많은 고민을했다 왜 시작위치로 안갈까
결과는 내가 좀더 다양한 함수를 써보고 싶어서 이동하는 함수를 다 다른거를 썼다 nav, movetohwards, 목적지 - 내위치 노말라이즈 해서 더해주는거까지 다양한 함수를 써보고 싶었기때문에 조금 오래 걸린거 같다 .
이제는 캐릭터, 몬스터 구현을 끝내고 인벤토리 등을 구현할 예정이기때문에
먼저 캐릭터 스탯 구현을 하고 몬스터 정보 구현을 해서 몬스터 스크립트를 조금 정리해서 몬스터 코드를 수정할 일 없게 만들 예정이다.
그리고 깃이 push 가 안되서 revert를 했는데 했떤작업이 다날라가서 지금 .. 14 처음 부터 다시해야한다 ..
하
반응형
'개인프로젝트 3D RPG 개발일지' 카테고리의 다른 글
17.(유니티포폴) 인벤토리구현 (0) | 2022.07.05 |
---|---|
16.(유니티포폴) 스탯 구현 및 적용 (0) | 2022.07.04 |
14.(유니티포폴) 맵구현 (0) | 2022.07.01 |
14.(유니티포폴)몬스터 ai 구현 (0) | 2022.06.30 |
13.(유니티포폴) 몬스터 ai 구현 (0) | 2022.06.29 |