[Project] RPG_TEST(Nav, 클릭한 곳에 오브젝트 생성)
in Unity
클릭한 곳에 Touch글자가 나타나게 하고, Player가 터치한 곳으로 이동하게 하기(NavMesh 이용)
Touch 텍스트 만들기
(1) UI - TMP(TouchEffect) 만들기 text(Touch), 크기(50), 정렬(가운데 중간)
(2) TouchEffect에 애니메이션 적용을 위해 Animation폴더에 UI폴더를 만들고 그 안에 애니메이션(TouchEffect) 하나 생성한다.
(3) TouchEffect애니메이션을 TouchEffect오브젝트에 넣어준다.
(4) 애니메이션을 제작하는데 Animation창을 열고 TouchEffect를 클릭한 다음 녹화버튼을 눌러서 나타날 때 커지는 애니메이션을 만든다.
(5) 크기(0.5 / 0.5 / 1), 크기(2 / 2 / 1) 녹화 버튼을 다시 눌러 녹화를 끝낸다.
(6) Canvas의 Canvas Scaler: Sclae Mode(Scale With ScreenSize), Reference Resolution(1920 / 1080)
(7) Touch텍스트가 나타났다가 자동으로 사라지는 DisableObj스크립트를 만든다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DisableObj : MonoBehaviour
{
public float disableTime; // 비활성화 될 시간
private void OnEnable()
{
// 오브젝트가 활성화되면 실행중인 Invoke를 취소
CancelInvoke();
Invoke("Disable", disableTime);
}
// 오브젝트를 끄는 기능
void Disable()
{
gameObject.SetActive(false);
}
}
(8) TouchEffect 오브젝트에 DisableObj를 넣어주고 disableTime를 0.5로 설정하고 비활성화 한다.
게임을 실행시키고 활성화 시키면 TouchEffect가 커졌다가 자동으로 사라지는 모습을 볼 수 있다.
(9) 터치를 감지해 줄 Panel(PlayerController)을 만든다. 색상(알파값 0)
(10) Player오브젝트를 제어 하고 TouchEffect를 제어하는 PlayerController스크립트를 만든다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class PlayerController : MonoBehaviour, IPointerClickHandler
{
[Header("Camera")]
public Camera cam;
public GameObject touchEffect;
RaycastHit hit;
public void OnPointerClick(PointerEventData eventData)
{
Ray ray = cam.ScreenPointToRay(eventData.position);
Physics.Raycast(ray, out hit);
if (hit.transform != null)
{
touchEffect.SetActive(false);
touchEffect.transform.position=cam.WorldToScreenPoint(hit.point);
touchEffect.SetActive(true);
}
}
}
(11) PlayerController오브젝트에 PlayerController스크립트를 넣어주고 변수들을 할당한다.
(12) 마을 오브젝트에 있는 Pane을 선택하고 BoxCollider를 추가한다.
TIP) 콜라이더가 있어야 Ray에 맞을 수 있다. 우리는 PlayerController스크립트에서 Ray를 사용하기 때문에 추가한다.
(13) TouchEffect오브젝트를 회전시킨다.(0 / 0 / 14)
이제 게임을 실행시키면 내가 클릭한 곳에 Touch텍스트가 생기는 모습을 볼 수 있다.
플레이어 이동
(1) NavMesh를 사용하기 위해서 마을 오브젝트에서 Plane과 Props를 선택하고 인스펙터 창의 오른쪽 상단에 있는 static을 눌러 Navigation Static을 선택한다.
(2) Window - AI -Navigation를 눌러서 Navigation창을 열고 Bake탭으로 가서 Bake해준다.
(3) Player 오브젝트에 Nav Mesh Agent컴포넌트를 넣어주고 다음과 같이 설정한다.
(4) PlayerController스크립트를 수정한다.(플레이어 움직임 추가)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.AI;
public class PlayerController : MonoBehaviour, IPointerClickHandler
{
[Header("Camera")]
public Camera cam;
public GameObject touchEffect;
RaycastHit hit;
[Header("Player")]
public Transform player;
public float moveSpeed;
public float ratateSpeed;
NavMeshAgent playerNav;
private void Start()
{
playerNav = player.GetComponent<NavMeshAgent>();
playerNav.speed = moveSpeed;
playerNav.angularSpeed = ratateSpeed;
}
public void OnPointerClick(PointerEventData eventData)
{
Ray ray = cam.ScreenPointToRay(eventData.position);
Physics.Raycast(ray, out hit);
if (hit.transform != null)
{
touchEffect.SetActive(false);
touchEffect.transform.position=cam.WorldToScreenPoint(hit.point);
touchEffect.SetActive(true);
if (hit.transform.gameObject.tag == "Land")
playerNav.SetDestination(hit.point);
}
}
}
(5) PlayerContoller컴포넌트에 변수를 할당한다. moveSpeed(5), RotateSpeed(200)
(6) 마을 오브젝트에 있는 plane에 Land태그를 생성하고 태그를 Land로 바꿔준다.
이제 게임을 실행하면 내가 클릭한 곳으로 Player 오브젝트가 움직이는 모습을 볼 수 있다.