지난번에 이어 게임을 만들어보자.
이번에 참고할 강의는 아래 강의이다.
https://www.youtube.com/watch?v=9bYy1uqHY0Q&list=PLFt_AvWsXl0ctd4dgE1F8g3uec4zKNRV0&index=20
이번 강의에서는 크로스헤어(조준점)을 추가해본다.
시작해보자.
유튜브 강의를 통해 제작한 조준점 이미지나 다운받은 이미지를 프리팹 폴더에 추가한다.
스프라이트로 설정하고 씬으로 가져와보자.
색상을 검정색으로 바꿔주고 복사 후 이름을 Dot 으로 변경하여 하위 오브젝트로 둔다.
스프라이트도 원으로 바꿔주어 조준점으로 사용한다.
이 조준점은 장애물과 같은 렌더링된 다른 오브젝트들에 가려진다.
이를 위해 메인 카메라 오브젝트를 복사하고 메인 카메라 태그를 제거 한 뒤
이름을 Crosshair Camera 로 설정, 메인 카메라 오브젝트의 하위 오브젝트로 둔다.
컬링 마스크를 UI 만 설정하고 플래그 지우기는 뎁스만, 뎁스는 1로 설정해
메인 카메라 위에 렌더링되도록 설정한다.
메인 카메라의 컬링 마스크에서는 UI 만 제외한다.
그리고 Crosshairs 오브젝트의 레이어를 UI 로 설정해주자.
이제 이 조준점이 마우스를 따라 움직이도록 설정하자.
Player 스크립트를 수정해 이전에 플레이어 방향이 마우스커서를 따라오도록 했을 때를 참고하여
조준점이 마우스 커서를 따라오도록 설정하자.
또한 Crosshair 스크립트를 생성 해 적용하여 조준점이 회전하도록 하고,
조준점이 적의 위치에 있을 때 가운데 점의 색상이 바뀌도록 해보자.
| Crosshair 스크립트
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Crosshair : MonoBehaviour
{
public LayerMask targetMask; // 타겟(적)마스크 레퍼런스
public SpriteRenderer dot; // 점 스프라이트 렌더러 레퍼런스
public Color dotHighlightColour; // 점 하이라이트 색상
Color originalDotColour; // 점 기존 색상
void Start() {
Cursor.visible = false; // 커서 안보이도록 설정
originalDotColour = dot.color; // 점 기존 색상 저장
}
void Update() {
transform.Rotate(Vector3.forward * -40 * Time.deltaTime); // 회전
}
// ■ 조준점 레이캐스트 메소드
public void DetectTarget(Ray ray) {
if (Physics.Raycast(ray, 100, targetMask)) { // 타겟 마스크에 레이가 닿은 경우
dot.color = dotHighlightColour; // 점 색상 하이라이트 색상으로 변경
}
else {
dot.color = originalDotColour; // 점 색상 기존 색상으로 변경
}
}
}
| Player 스크립트
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(GunController))] // GunController 스크립트를 포함
[RequireComponent(typeof(PlayerController))] // PlayerController 스크립트를 포함
public class Player : LivingEntity
{
public float moveSpeed = 5.0f; // 플레이어 이동속도
public Crosshair crosshairs; // 조준점 레퍼런스
Camera viewCamera; // 카메라
PlayerController controller; // 플레이어 컨트롤러
GunController gunController; // 총 컨트롤러
protected override void Start() { // override 로 부모 클래스의 메소드를 재정의.
base.Start(); // base 를 통해 부모 클래스의 기존 메소드를 호출.
controller = GetComponent<PlayerController>();
// 현재 오브젝트의 플레이어 컨트롤러를 가져옴
gunController = GetComponent<GunController>();
// 현재 오브젝트의 총 컨트롤러를 가져옴
viewCamera = Camera.main;
// 카메라
}
void Update() {
// 이동 입력
Vector3 moveInput = new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxis("Vertical"));
// GetAxisRaw 로 스무딩 X
Vector3 moveVelocity = moveInput.normalized * moveSpeed;
// normalized 로 단위벡터로 변환, 이동 속도를 계산
controller.Move(moveVelocity);
// 이동 속도를 이동 메소드로 전달
// 방향 입력
Ray ray = viewCamera.ScreenPointToRay(Input.mousePosition);
// 카메라 -> 마우스 커서 위치로 레이 발사.
Plane groundPlane = new Plane(Vector3.up, Vector3.up * gunController.GunHeight);
// 평면의 법선벡터 생성.
float rayDistance;
// 위에서 쏜 레이와 평면의 교차지점까지 거리
if (groundPlane.Raycast(ray, out rayDistance)) {
// 레이가 평면과 교차하는 경우 교차지점까지의 거리를 rayDistance 에 저장.
Vector3 point = ray.GetPoint(rayDistance);
// GetPoint 와 교차지점까지의 거리로 교차지점의 위치를 저장.
// 카메라부터 교차지점까지 선으로 표시 : Debug.DrawLine(ray.origin, point, Color.red);
controller.LookAt(point);
// 플레이어 컨트롤러의 방향 전환 메소드에 교차 지점(방향) 전달.
crosshairs.transform.position = point;
// 조준점 위치 설정
crosshairs.DetectTarget(ray);
// 조준점 레이캐스트
}
// 무기 조작 입력
if (Input.GetMouseButton(0)) // 마우스 왼쪽 버튼 클릭 시
{
gunController.OnTriggerHold(); // 방아쇠 당김 메소드 호출
}
if (Input.GetMouseButtonUp(0)) // 마우스 왼쪽 버튼 클릭 후 손을 뗄 시
{
gunController.OnTriggerRelease(); // 방아쇠 놓음 메소드 호출
}
}
}
무기의 높이에 맞게 조준점이 나타나도록 GunController 스크립트에서 무기 높이 반환 메소드를 추가하자.
| GunController 스크립트
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GunController : MonoBehaviour {
public Transform weaponHold; // 플레이어 손(총)위치
public Gun startingGun; // 시작 총
Gun equippedGun; // 착용하는 총
private void Start() {
if (startingGun != null) { // 시작 총이 설정된 경우
EquipGun(startingGun); // 시작 총을 착용
}
}
// ■ 총 착용 메소드
public void EquipGun(Gun gunToEquip) {
if (equippedGun != null) { // 착용중인 총이 있다면
Destroy(equippedGun.gameObject); // 착용중인 총(오브젝트)를 제거(파괴)
}
equippedGun = Instantiate(gunToEquip, weaponHold.position, weaponHold.rotation) as Gun;
// 착용중인 총에 전달받은 총 오브젝트를 인스턴스화하여 생성
equippedGun.transform.parent = weaponHold;
// 착용중인 총의 위치를 설정, 부모 오브젝트를 설정하여 위치를 부모 오브젝트의 위치로.
}
// ■ 방아쇠 당김 메소드
public void OnTriggerHold()
{
if(equippedGun != null) // 착용중인 총이 있다면
{
equippedGun.OnTriggerHold(); // 방아쇠 당김
}
}
// ■ 방아쇠 놓음 메소드
public void OnTriggerRelease()
{
if (equippedGun != null) // 착용중인 총이 있다면
{
equippedGun.OnTriggerRelease(); // 방아쇠 놓음
}
}
// ■ 무기 높이 반환 메소드
public float GunHeight {
get {
return weaponHold.position.y; // 무기의 y좌표(높이)반환
}
}
}
이제 Player 오브젝트로 가서 인스펙터의 Corsshair 에 Crosshairs 오브젝트를 할당하자.
Crosshairs 오브젝트의 Target Mask 는 Enemy 로 설정하고
Dot 에 Dot 오브젝트를 할당한 후 하이라이트 컬러를 설정한다.
이제 실행해보자
조준점이 마우스 커서를 따라 움직이고, 회전하다가 적 위에 올라가면 가운데 점의 색상이 바뀐다.
다음 강의에서는 무기 발사 반동과 재장전 기능을 추가해본다.
'Unity > 게임개발' 카테고리의 다른 글
[Unity] 게임 개발 일지 | 탑다운 슈팅 21 (0) | 2023.12.13 |
---|---|
[Unity] 게임 개발 일지 | 탑다운 슈팅 20 (1) | 2023.12.12 |
[Unity] 게임 개발 일지 | 탑다운 슈팅 18 (0) | 2023.12.11 |
[Unity] 게임 개발 일지 | 탑다운 슈팅 17 (0) | 2023.12.08 |
[Unity] 게임 개발 일지 | 탑다운 슈팅 16 (0) | 2023.12.07 |