728x90
이번에는 맞게되면 타겟을 설정하고 타겟을 따라오게끔 코드를 짯다
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(curHp>0)// 현재 hp 가 0보다크다면
{
myrenderer.material.color = new Color(1, 1, 1); //원래색깔로
CharacterManger characterManger = GameObject.Find("Archer").GetComponent<CharacterManger>();
characterManger.fixTarget = true; //만약 맞았는데 현재 hp 가 0보다크면 타겟 고정을 위해 스탑 코루틴 켜줄 bool 조정
}
if (curHp <= 0)//현재 hp 가 0보다 작다면
{
ChangeState(State.DIE);
}
}
몬스터에 Ondamge 코루틴쪽에 첫번째부터 4째줄 까지 추가해주고
IEnumerator Battle()
{
myanim.SetBool("IsRunnig", true); // 뛰어오는 애니메이션 재생을위해
while (true)
{
myanim.SetBool("IsWalking", false); // walking 이 true 로 안바뀌기위해
if(myanim.GetBool("IsAttack")==false && myanim.GetBool("IsDamage") ==false ) // 공격애니메이션이 재생중이 아니거나 맞는 애니메이션이 재생중이아닐때만 따라가게
{
nav.SetDestination(myTarget.transform.position); // 따라가게 하기위한 코드
}
float distance = Vector3.Distance(transform.position, myTarget.transform.position); // 플레이어와 몬스터사이 거리 재기위함
if(distance<= Attackrange) // 거리가 어택사거리 보다 짧거나 같다면
{
if(myanim.GetBool("IsAttack")==false) // 공격중이아니라면
{
myanim.SetTrigger("Attack"); //공격애니메이션 재생
}
}
yield return null;
}
}
새롭게 battle 을 만들어 이번에는 nav 로 나를 따라오게만들었다.
맞는 애니메이션일때 안따라오길 바라고 코드를 짰는데 다시 수정해야할거같다.
그리고 로밍상태일때 마지막에 x값이 변경되면서 앞으로 고꾸라지는 현상도 고쳐야할거같다.
IEnumerator Battle()
{
myanim.SetBool("IsRunnig", true); // 뛰어오는 애니메이션 재생을위해
while (true)
{
myanim.SetBool("IsWalking", false); // walking 이 true 로 안바뀌기위해
nav.SetDestination(myTarget.transform.position); // 따라가게 하기위한 코드
if (myanim.GetBool("IsAttack")==true || myanim.GetBool("IsDamage") ==true ) // 공격애니메이션 이나 데미지애니메이션 둘중하나라도 재생중이라면 움직임이 멈추고
{
nav.isStopped=true;
}
else // 아니라면 움직여라
{
nav.isStopped = false;
}
float distance = Vector3.Distance(transform.position, myTarget.transform.position); // 플레이어와 몬스터사이 거리 재기위함
if(distance<= Attackrange) // 거리가 어택사거리 보다 짧거나 같다면
{
if(myanim.GetBool("IsAttack")==false) // 공격중이아니라면
{
myanim.SetTrigger("Attack"); //공격애니메이션 재생
}
}
yield return null;
}
}
이렇게해주니 멈추는거는 잘멈추는데
lookat 할때 y값이 0 이라 앞으로 고꾸라지나 싶어서 y값을 몬스터와 같게해줬는데도 고꾸라져서 y값을 조금씩 높혀줬더니 이제는 고꾸라지지 않는다 .
이제 공격을 구현해줄 차례이다.
일단은 플레이어 피격을 위해 플레이어에 코드를 넣어준다
public Renderer[] meshs;// 플레이어 mesh 배열
public bool isDamage; // 무적시간 재는용
private void OnTriggerEnter(Collider other)
{
if(other.tag == "EnemyAttack") // 닿은 콜리더 tag가 EnemyAttack 일때
{
if (!isDamage) // 무적시간 이 끝났을때
{
float dmage = other.GetComponentInParent<Monster>().Damage; // 몬스터 데미지 얻어와서 hp - 해줄려고
Debug.Log("Hitplayer"); // 확인용
StartCoroutine(Ondamage()); // 코루틴시작
}
}
}
IEnumerator Ondamage()
{
isDamage = true; // 무적시간 재는용 true 라면 무적
for(int i=0;i<meshs.Length;i++ ) // mesh 가 여러개있어서 배열로 받아놓고 for 문돌려준다
{
meshs[i].material.color = Color.red; //모든 mseh 를 빨간색으로변경
}
yield return new WaitForSeconds(1.0f); // 1초후
for (int i = 0; i < meshs.Length; i++)
{
meshs[i].material.color = Color.white; // 모든 mesh 흰색으로 변경
}
isDamage = false; // 무적시간 재는용 false
}
이런식으로 넣어주고
if (distance <= Attackrange) // 거리가 어택사거리 보다 짧거나 같다면
{
if (myanim.GetBool("IsAttack") == false) // 공격중이아니라면
{
myanim.SetTrigger("Attack"); //공격애니메이션 재생
StartCoroutine(Attack()); // 코루틴시작
}
}
IEnumerator Attack()
{
AttackPoint.SetActive(true); // 어택 콜리더 활성화
yield return new WaitForSeconds(1f);// 1초후
AttackPoint.SetActive(false);// 어택콜리더 비활성화
}
스타트 코루틴만 넣어줬고
이런식으로 하게되면
이런식으로 되게된다
나는 데미지 입는 애니메이션이 있는거보다는 색만 변경되는게 좋아서 이런식으로 하려고한다 .이제는 맵을 구하기위해서 에셋을 조금 찾아보고 터레인등으로맵을 제작하려한다 .
반응형
'개인프로젝트 3D RPG 개발일지' 카테고리의 다른 글
15.(유니티포폴) 몬스터 ai 수정 및 오토타겟팅 수정 (0) | 2022.07.03 |
---|---|
14.(유니티포폴) 맵구현 (0) | 2022.07.01 |
13.(유니티포폴) 몬스터 ai 구현 (0) | 2022.06.29 |
12.(유니티포폴) 몬스터 피격 구현 (0) | 2022.06.28 |
11.(유니티포폴)캐릭터구현 (1) | 2022.06.27 |