ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 게임개발 : 스텔스 게임 1
    Unity 2023. 4. 4. 01:12

    간단한 토이프로젝트로 만들어보는 게임. 

     

    기획 

    - 주인공이 움직이면서 맵을 돌아다니면서 경비원을 피하면서 많은 점수를 획득하는 게임. 

     

    개발환경

    - Unity 2019.x 

    - Visual Studio 2019 Community 

     

    개발목적 

    1) 주인공을 추적하는 적 AI 구현

    2) 범위 내 캐릭터를 인식하는 시스템 구현

    적 : Capsule 오브젝트

    경로 : 빈 오브젝트를 이용한 Waypoints 생성 

    ( 현재 유니티 에디터 상에는 Waypoints 및 경로가 보이나, 인게임에서는 해당부분이 확인 안됨. )

    범위 : 미완성이며, 현재 게임상에서 보여주기 위해 spotlight 게임 오브젝트를 적 오브젝트의 자식으로 추가함

     

    현재 적(Guard) 코드는 아래와 같으며, 현재 기능구현은 다음과 같다.

    - 경로(waypoint) 따라가기

    - 경로(waypoint)를 따라가면 적 시야도 회전 

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Guard : MonoBehaviour
    {
        public Transform pathHolder;
    
        public float speed = 5.0f;
        public float waitTime = 0.3f;
        public float turnSpeed = 90; // 1초에 90도 회전
    
        void OnDrawGizmos()
        {
            Vector3 startPosition = pathHolder.GetChild(0).position;
            Vector3 previousPosition = startPosition;
    
            foreach(Transform waypoint in pathHolder)
            {
                Gizmos.DrawSphere(waypoint.position, 0.3f);
                Gizmos.DrawLine(previousPosition, waypoint.position);
                previousPosition = waypoint.position;
            }
            // 이어지지 않은 마지막 선 이어주기 
            Gizmos.DrawLine(previousPosition, startPosition);
        }
    
        IEnumerator FollowPath(Vector3[] waypoints)
        {
            transform.position = waypoints[0];
    
            int targetWaypointIndex = 1;
            Vector3 targetWaypoint = waypoints[targetWaypointIndex];
            transform.LookAt(targetWaypoint);
    
            while(true)
            {
                transform.position = Vector3.MoveTowards(transform.position, targetWaypoint, speed * Time.deltaTime);
                if(transform.position == targetWaypoint)
                {
                    targetWaypointIndex = (targetWaypointIndex + 1) % waypoints.Length;
                    targetWaypoint = waypoints[targetWaypointIndex];
                    yield return new WaitForSeconds(waitTime);
    
                    StartCoroutine(TurnToFace(targetWaypoint));
                }
                yield return null;
            }
        }
        IEnumerator TurnToFace(Vector3 lookTarget)
        {
            // 방향벡터
            Vector3 dirToLookTarget = (lookTarget - transform.position).normalized;
    
            // 타겟과의 각도 구하기
            float targetAngle = 90 - Mathf.Atan2(dirToLookTarget.z, dirToLookTarget.x) * Mathf.Rad2Deg;
    
            // 얼마나 각도가 떨어져 있는지 가늠하기 위해 DeltaAngle 사용
            while(Mathf.DeltaAngle(transform.eulerAngles.y, targetAngle) > 0.05f)
            {
                float angle = Mathf.MoveTowardsAngle(transform.eulerAngles.y, targetAngle, turnSpeed * Time.deltaTime);
                transform.eulerAngles = Vector3.up * angle;
                yield return null;
            }
        }
    
        void Awake()
        {
            // 유니티에선 Awake가 생성자에 해당하는 역할 ( 최초 1번만 해당함수 호출 ) 
            speed = 5.0f;
            waitTime = 0.3f;
        }
    
        // Start is called before the first frame update
        void Start()
        {
            Vector3[] waypoints = new Vector3[pathHolder.childCount];
            for(int i=0; i<waypoints.Length; ++i)
            {
                waypoints[i] = pathHolder.GetChild(i).position;
                waypoints[i] = new Vector3(waypoints[i].x, transform.position.y, waypoints[i].z);
            }
    
            StartCoroutine(FollowPath(waypoints));
        }
    
        // Update is called once per frame
        void Update()
        {
            
        }
    }

     

    현재 아래 영상을 참고하여 공부 및 개발진행중이다. 

    https://youtu.be/jUdx_Nj4Xk0

     

    댓글

Designed by Tistory.