728x90

어제는 부채꼴 모양 적판별을 했다면

오늘은 제일 가까운 타겟을 지정해주려고한다.

 

  if(Targets.Count != 0)//판별된 적이 1명이라도 있다면 실행되게 
        {

            if (targettingimg != null) //새로 타겟팅 됬을때 이미지를 초기화시켜주기위해 
                targettingimg.SetActive(false);

            myTarget = Targets[0];//첫번째 타겟을 나의타겟으로 넣어놓고 
            curtarget = Vector3.Distance(transform.position, Targets[0].transform.position);// 그 타겟과 나의 거리를 계산한뒤 

            for(int i=1;i<Targets.Count;i++) //for 문을 돌려주는데 i 의 0번째는 이미 들어갔기때문에 1번째부터 비교하기위해 i= 1 
            {
                float dist=Vector3.Distance(transform.position,Targets[i].transform.position);  //[i]번째 타겟과 내 거리를 계산하고
                if(dist<curtarget)// [i]번째 타겟의 거리가 현재타겟의 거리보다 작으면 실행
                {
                    myTarget=Targets[i]; //나의타겟은 [i]번째 타겟으로바뀌고
                    curtarget = dist; // 현재 타겟과의거리도 [i]번째 타겟의거리로 넣어준다.
                }
            }

            targettingimg = myTarget.transform.Find("Canvas").transform.gameObject;// 나의 타겟에 캔버스를 찾아서 
            targettingimg.SetActive(true);// 캔버스를 보이게해준다.
        }
        else if(Targets.Count==0 && targettingimg != null)//만약 타겟이 없고 타겟팅이미지가 null이아니면 안보여지게하기위해 
        {
            targettingimg.SetActive(false);
        }

이런식으로 코드를 추가해준다.

 

 

이제 설명말고 주석을 달아놓을예정이라서 추가적인 설명은 없을거같다.

 

 

 

 

너무 이렇게 휙휙 바뀌는데 

코드를 추가해서 2~3초마다 바뀌게 할 예정이며 

그리고 만약 몬스터한테 어택을 가했다면 myTarget은 바뀌지않을예정이다 몬스터가 죽을때까지

 

그렇다면이제는 공격을 구현해볼 차례이다

 

기본공격은 화살에 낙차를 구현하지않고 그냥 공격을 누르면 무조건 맞는형식으로 갈예정이다.

 

대충 버튼하나만들어주고 

공격버튼이라고하고

 

캐릭터스크립트에서

 

 public void OnclickAttackButton()
    {
        if(myanim.GetBool("IsAttack")==false)//파라메터 IsAttack false 일때 실행
        {
            if (targetIndistance != null) // 첫클릭시 주위에 적이 있다면 
            {
                ChangeState(State.BATTLE); //배틀모드로 바꿔주고 

            }
            if (myTarget != null) //배틀모드일때 타겟이 null이 아니라면 
            {
                CanMove = false; // 움직임제한
                myanim.SetTrigger("Attack"); // 어택 트리거 활성화
                transform.LookAt(myTarget.transform); // 타겟바라보게 
            }


        }



    }

 

온클릭이벤트 함수추가해준후 

 

공격애니메이션 클릭후

 

 

스크립트추가후

 

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

public class AttackState1 : StateMachineBehaviour
{
 
   override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        animator.SetBool("IsAttack", true); //enter 들어갈때 true로변경 
    }

 

enter일때 파라메터 isattack true로

 

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

public class AttackState2 : StateMachineBehaviour
{
    // OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
  

    // OnStateExit is called when a transition ends and the state machine finishes evaluating this state
    override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
   {
        animator.SetBool("IsAttack", false); //애니메이션 끝날때 false 변경
        GameObject.Find("Archer").GetComponent<CharacterManger>().CanMove = true;
    }

exit 일때 false 로 바꿔준후 

 

 

 

이런식으로 Isattack false 일때만 애니메이션 전환가능하게 바꿔준다.

 

 

 

이런식으로 변경된다.

 

 

일단은 애니메이션에 이벤트 생성후 이벤트 생성때 호출할 함수를 작성해준다

 

 public void DrawArrow()
    {
        GameObject go = Instantiate(arrow, arrowpoint.transform.position, arrowpoint.transform.rotation);

    }

arrow 에는 arrow 프리팹이 들어가고 arrow point는 손쪽에 만들어줬다.

 

그리고 arrow에 함수를 추가한후 

 

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

public class Arrow : MonoBehaviour
{
    public GameObject arrow;
    public Transform StartArrowPos;
 
    public float speed = 15f;
    public GameObject Target;
   
    // Start is called before the first frame update
    void Start()
    {
      

        Target = GameObject.Find("Archer").GetComponent<CharacterManger>().myTarget;//타겟 = 캐릭터의타겟 
    }

    // Update is called once per frame
    void Update()
    {
      
            
            if(Target!=null)
            {
                transform.position = Vector3.MoveTowards(transform.position, Target.transform.position, 1f);//타겟의 거리까지 1초만에 날아가게 

            }
       
        
    }
   
}

 

 

작성후 영상을보면 이런식으로 날아가게된다.

 

지금 화살이 없어지지않아서 타겟이 풀리는거같은데 내일은 타겟에 적중시 화살이 없어지고 효과 를 적용해보려하고 이후타겟팅도 한번 보려고한다.

반응형