0409 캐릭터의 시야각과 공격범위 생성

2021. 4. 9. 18:10unity

벡터  = 위치, 방향, 회전, 속도, 크기 등에서 사용

벡터의 종류
1. 수 묶음 벡터 (요소, 요소)
2. 기하 백터

벡터 (방향, 크기
상대좌표: 현재 죄표에서 나의 좌표
절대 좌표: 게임 세상속에서의 나의 좌표

벡터의 곱: 스칼라 곱
벡터의 길이ㅏ 늘어난다. (요소의 곱)

크기가 1인 벡터: 단위 벡터 (방향 벡터)
Vector3. forward(절대 좌표에서의 forward)


에디터 스트립트는 꼭 에디터 폴더 안에 있어야 함
1. 모노비헤이비어를 참조로 가지고 있는 경우
2. 단일로 있는 경우

 

 

using UnityEngine;

public class Hero : MonoBehaviour
{
    private Fov fov;
    private GameObject[] monsters;
    // Start is called before the first frame update
    void Start()
    {
        this.fov = this.GetComponent<Fov>();
        this.monsters = GameObject.FindGameObjectsWithTag("monster");
    }

    // Update is called once per frame
    void Update()
    {
        foreach (var monster in this.monsters) 
        {
            var toOther = monster.transform.position - this.transform.position; //몬스터의 방향
            var angle = Vector3.Angle(this.transform.forward, toOther); //몬스터와의 각도
            var distance = toOther.magnitude; //길이

            if (distance <= this.fov.area && angle < this.fov.angle / 2) 
            {
                Debug.DrawLine(this.transform.position, monster.transform.position, Color.red);
            }
        }
        
    }
}
using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(Fov))]
public class FovEditor : Editor
{
    private void OnSceneGUI()
    {
        Fov fov = (Fov)this.target;
        //주어진 각도의 1/2
        Vector3 fromAnglePos = fov.CirclePoint(-fov.angle * 0.5f);
        fov.anglePos = fromAnglePos;

        //색상
        Handles.color = new Color(1, 1, 1,0.3f);
        Handles.DrawWireDisc(fov.gameObject.transform.position, //원점
           Vector3.up,                                          //방향 벡터
           fov.area);                                           //원의 반지름

        Handles.DrawSolidArc(fov.transform.position,  //원점
            Vector3.up,    //노멀백터
            fromAnglePos,  //시작위치
            fov.angle,     //각도
            fov.area);     //반지름

        GUIStyle guiStyle = new GUIStyle();
        guiStyle.fontSize = 40;
        Handles.Label(fov.transform.position + fov.transform.forward,
            fov.angle.ToString(), guiStyle);
    }
}
using UnityEngine;

public class Fov : MonoBehaviour
{
    public float area = 1f;
    public float angle = 60f;

    public Vector3 anglePos;

    public Vector3 CirclePoint(float angle) 
    {
        return new Vector3(
            Mathf.Sin((angle + this.transform.eulerAngles.y) * Mathf.Deg2Rad),
            0,
            Mathf.Cos((angle + this.transform.eulerAngles.y) * Mathf.Deg2Rad));
    }
}

 

몹이 캐릭터의 공격범위 안에 들어올 경우 붉은색 줄이 그려지도록 만듦.