유니티 심화

HeroShooter - 가까운 거리 몬스터 선 그리기

다모아 2023. 8. 24. 18:13
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Stage1SceneMain : MonoBehaviour
{
    //플레이어
    [SerializeField]
    private PlayerController playerController;
    //몬스터
    [SerializeField]
    private GameObject monsterGo;
    //조이스틱
    [SerializeField]
    private CJoystick joystick;
    //왼쪽 문
    [SerializeField]
    private DoorController leftDoorController;
    //오른쪽 문
    [SerializeField]
    private DoorController rightDoorController;
    //페이드인
    [SerializeField]
    private Image dim;
    //NPC 텍스트
    [SerializeField]
    private Text text;
    //TargetQuad
    [SerializeField]
    private GameObject targetQuadGo;
    //반지름
    private float radius = 30f;

    // Start is called before the first frame update
    void Start()
    {
        //씬 전환시 페이드인
        this.StartCoroutine(this.CoFadeInAndSceneManager());
        //포탈에 닿았을 때
        this.playerController.reachPortal = () => {
            //포탈 삭제하고
            //Destroy(this.portalGo.gameObject);
            //문 열기
            //this.leftDoorController.OpenDoor();
            //this.rightDoorController.OpenDoor();
        };

        //문에 닿았을 때
        this.playerController.reachDoor = () => {
            //씬 전환하기
            //this.FadeOutAndSceneManager();
        };
    }

    // Update is called once per frame
    void Update()
    {
        //수평, 수직 좌표 구하고 moveDir에 넣기
        float h = this.joystick.Horizontal;
        float v = this.joystick.Vertical;
        Vector3 moveDir = new Vector3(h, 0, v);
        //moveDir이 Vector3.zero일 경우
        if (moveDir == Vector3.zero)
        {
            //정지 애니메이션 실행
            this.playerController.PlayAnimation(EnumState.ePlayerState.Idle);
        }
        else // (0,0,0)이 아닐 경우
        {
            this.playerController.Move(moveDir);
        }
        //OverlapSphere로 몬스터 인식하기
        int layerMask = 1<<LayerMask.NameToLayer("Monster");
        Collider[] hitColliders = Physics.OverlapSphere(this.playerController.transform.position, this.radius, layerMask);
        //인식되는 물체 이름 로그찍기
        foreach (Collider cols in hitColliders)
        {
            //몬스터와 나의 거리 구하기
            Vector3 disDiffrence = cols.transform.position - this.playerController.transform.position;
            //몬스터와 내가 가까운지 확인하기
            float distance = Vector3.Distance(cols.transform.position, this.playerController.transform.position);
            //몬스터와 나의 거리 선으로 그리기
            DrawArrow.ForDebug(this.playerController.transform.position, disDiffrence, 0.01f, Color.green, ArrowType.Solid);
        }
    }

    private IEnumerator CoFadeInAndSceneManager()
    {
        Color color = this.dim.color;
        while (true)
        {
            color.a -= 0.01f;
            this.dim.color = color;

            if(color.a <= 0)
            {
                break;
            }
            yield return null;
        }
    }
}

스테이지1에서 몬스터 선그리기와 인식하기는 완료