MoveCtrl.cs 2.94 KB
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class MoveCtrl : MonoBehaviour
{

    public enum MoveType
    {
        WAY_POINT,
        LOOK_AT,
        DAYDREAM
    }
    public MoveType moveType = MoveType.WAY_POINT; // 이동 방식
    public float speed = 1.0f;                     // 이동 속도
    public float damping = 3.0f;                   // 회전 속도를 조절할 계수
    private Transform tr;
    private Transform camTr;
    private CharacterController cc;
    private Transform[] points;                    // 웨이포인트를 저장할 배열
    private int nextIdx = 1;                       // 다음에 이동해야 할 위치 변수

    public static bool isStopped = false;
    public Text stepText;
    public int afterStep;
    public int beforeStep;


    GameObject Step;
    void Start()
    {
        tr = GetComponent<Transform>();
        camTr = Camera.main.GetComponent<Transform>();
        cc = GetComponent<CharacterController>();
        points = GameObject.Find("WayPointGroup").GetComponentsInChildren<Transform>();
        Step = GameObject.Find("Step");
        stepText = Step.GetComponent<Text>();
        beforeStep = int.Parse(stepText.text);
    }
    void Update()
    {
        if (isStopped)
            return;
        switch (moveType)
        {
            case MoveType.WAY_POINT:
                MoveWayPoint();
                break;
            case MoveType.LOOK_AT:
                MoveLookAt();
                break;
            case MoveType.DAYDREAM:
                break;
        }
    }
    void MoveWayPoint()
    {
        afterStep = int.Parse(stepText.text);

        if (beforeStep != afterStep)
        {
            beforeStep = afterStep;
            // 현재 위치에서 다음 웨이포인트를 바로보는 벡터를 계산
            Debug.Log(nextIdx.ToString());
            Vector3 direction = points[nextIdx].position - tr.position;
            // 산출된 벡터의 회전 각도를 쿼터니언 타입으로 산출
            Quaternion rot = Quaternion.LookRotation(direction);
            // 현재 각도에서 회전해야 할 각도까지 부드럽게 회전 처리
            tr.rotation = Quaternion.Slerp(tr.rotation, rot, Time.deltaTime * damping);
            // 전진 방향으로 이동 처리
            tr.Translate(Vector3.forward * Time.deltaTime * speed);

        }

    }
    void MoveLookAt()
    {
        // 메인카메라가 바라보는 방향
        Vector3 dir = camTr.TransformDirection(Vector3.forward);
        // dir 벡터의 방향으로 초당 speed만큼씩 이동
        cc.SimpleMove(dir * speed);
    }
    void OnTriggerEnter(Collider coll)
    {
        // 웨이포인트(Point 게임오브젝트)에 충돌 여부 판단
        if (coll.CompareTag("WAY_POINT"))
        {
            // 다음 웨이포인트로 이동 
            nextIdx++;
        }
    }
}