새소식

Unity/PROJECT_S

[Unity] PROJECT_S / 23-08-21

  • -

카메라 시점과 플레이어 오브젝트의 색상을 변경했다.

(전에 사용한 빨간색은 적 오브젝트에 사용할 예정이다.)

 

그리고 직사각형 오브젝트는 플레이어 캠프로 사용하기 위해 만들었다.

 

Player_Ctrl.cs

        #region 플레이어 회전
        // 마우스 위치를 화면에서 광선으로 변환
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        RaycastHit hit; // 광선이 물체와 충돌 여부를 위한 변수

        // 광선이 물체와 충돌하는지 확인
        if (Physics.Raycast(ray, out hit, 100))
        {
            // 플레이어가 바라볼 방향 벡터를 계산
            Vector3 rotateVec = hit.point - rotateObject.transform.position;

            rotateVec.y = 0;    // 수평 회전을 위해 y축 값을 0으로 설정

            // 플레이어의 시선을 계산된 방향으로 회전
            rotateObject.transform.LookAt(rotateObject.transform.position + rotateVec);
        }
        #endregion

시점을 변경하니 전에 사용한 코드가 내 생각과 다르게 작동한다는 걸 알게 됐다.

 

그래서 보통 탑뷰에서 사용되는 Raycast 함수로 수정했다.

 

Player_Ctrl.cs

using UnityEditor.SceneManagement;
using UnityEngine;
using UnityEngine.UIElements;

public class Player_Ctrl : MonoBehaviour
{
    float targetRotationY = 0f; // 카메라 회전 각도 변수

    void Update()
    {
        #region 카메라 회전
        // 왼쪽 Alt 키가 눌렸을때 한 번
        if (Input.GetKeyDown(KeyCode.LeftAlt))
        {
            targetRotationY += 45f; // 회전 각도 45도 증가
        }

        // 카메라의 Y축 회전 각도를 할당
        float currentRotationY = transform.rotation.eulerAngles.y;

        // 현재 각도에서 다음 각도로 선형 보간
        float newRotationY = Mathf.LerpAngle(currentRotationY, targetRotationY, 10f * Time.deltaTime);
        // 카메라 Y축 회전
        transform.rotation = Quaternion.Euler(0f, newRotationY, 0f);
        #endregion
    }
}

(카메라 회전 코드를 추가)

 

플레이어가 여러 시점을 전환할 수 있도록 키를 누를 때마다 카메라 Y축으로 45도씩 회전하는 기능을 추가했다.

또, 부드러운 시점 전환을 위해 선형 보간 함수를 이용했다.

이 코드를 카메라 스크립트에 따로 만들어 넣지 않고 [Player_Ctrl] 스크립트에 추가한 이유는 회전 기준이 플레이어에게 있기 때문에 하위 오브젝트로 카메라를 넣어 쉽게 구현할 수 있었다.

코드를 보면 알겠지만 사실 카메라의 회전이 아니라 카메라의 최상위 오브젝트(빈 오브젝트)를 회전하는 것이다.

 

카메라 회전 코드를 적용한 결과

 

바닥을 기준으로 사방에 벽을 배치

V 키를 누른 상태에서 오브젝트의 꼭짓점을 드래그해서 다른 오브젝트의 꼭짓점으로 스내핑 할 수 있다.

 

적 AI를 구현하기 위해 [AI Navigation] 패키지를 설치했다.

 

2022.3.7f1 버전은 이 패키지가 기본으로 설치되어있지 않아 따로 설치해야 한다.

 

적으로 사용할 오브젝트를 만들고 플레이어 오브젝트와의 구분을 위해 빨간색을 사용했다.

 

충돌 감지를 위해 플레이어와 적에게 [Rigidbody] 컴포넌트를 추가했다.

 

[Freeze Rotation] 속성을 전부 체크해서 외부의 물리력에 회전하지 않게 고정한다.

 

적 AI를 바닥에서만 이동하게 하기 위해 Navigation으로 Bake했다.

 

Enemy.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class Enemy : MonoBehaviour
{
    NavMeshAgent agent; // NavMeshAgent 컴포넌트를 저장할 변수

    public Transform player; // 플레이어의 위치를 저장할 Transform 변수

    void Start()
    {
        // NavMeshAgent 컴포넌트를 현재 게임 오브젝트에서 가져옴
        agent = GetComponent<NavMeshAgent>();
    }

    void Update()
    {
        // 플레이어의 위치를 목적지로 설정
        agent.SetDestination(player.position);
    }
}

(새로 작성한 스크립트)

 

적 AI가 플레이어를 추적하게 간단하게 구현했다.

 

Bake한 바닥에서 플레이어를 추적하는 적 AI

다음에는 총기 관련 디테일과 HP, 데미지 시스템을 구현해 보겠다.

'Unity > PROJECT_S' 카테고리의 다른 글

[Unity] PROJECT_S / 23.09.11  (0) 2023.09.11
[Unity] PROJECT_S / 23-08-31  (0) 2023.08.31
[Unity] PROJECT_S / 23-08-22  (0) 2023.08.22
[Unity] PROJECT_S / 23-08-18  (0) 2023.08.18
[Unity] PROJECT_S / 23-08-16  (0) 2023.08.17
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.