-
게임개발 : 스텔스 게임 1Unity 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() { } }
현재 아래 영상을 참고하여 공부 및 개발진행중이다.
'Unity' 카테고리의 다른 글
UnityChan-SD 가지고 놀기 (0) 2023.04.17 TowerDefense 프로젝트 - 2 : Enemy 생성 (AI) (0) 2020.07.23 TowerDefense 프로젝트 - 1 : start, end point / path 만들기 (0) 2020.07.23 TowerDefense 프로젝트 - 0 (0) 2020.07.23