플레이어를 이동 시키기 위해서 InputManager 스크립트를 수정 하겠습니다
InputManager 스크립트를 엽니다
//InputManager 스크립트 수정
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class InputManager : MonoBehaviour
{
GameObject player;
// Start is called before the first frame update
void Start()
{
player = GameObject.FindGameObjectWithTag("Player");
}
void CheckClick()
{
if (Input.GetMouseButtonDown(0))
{
//카메라로부터 화면사의 좌표를 관통하는 가상의 선(레이)을 생성해서 리턴해 주는 함수
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
//Physics.Raycast(래이 타입 변수, out 레이캐스트 히트 타입변수) :
//가상의 레이저선(래이)이 충돌체와 충돌하면, true(참) 값을 리턴하면서 동시에 레이캐스트 히트 변수에 충돌 대상의 정보를 담아 주는 함수
if (Physics.Raycast(ray, out hit))
{
if (hit.collider.gameObject.name == "Terrain")
{
// player.transform.position = hit.point;
//마우스 클릭 지점의 좌표를 플레이어가 전달받은뒤,상태를 이동상태로 바뀜
player.GetComponent<PlayerFSM>().MoveTo(hit.point);
}
}
}
}
// Update is called once per frame
void Update()
{
CheckClick();
}
}
PlayerFSM 스크립트를 선택하고 스크립트를 엽니다
그리고 수정합니다
//PlayerFSM 스크립트 수정
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerFSM : MonoBehaviour
{
public enum State
{
Idle,
Move,
Attack,
AttackWait,
Dead
}
//idle 상태를 기본 상태로 지정
public State currentState = State.Idle;
//마우수 클릭 지점,플레이어가 이동할 목적지의 좌표를 저장할 예정
Vector3 curTargetPos;
public float rotAnglePerSecond = 360f; //1초에 플레이어의 방향을 360도 회전한다
public float moveSpeed = 2f; //초당 2미터의 속도로 이동
PlayerAni myAni;
void Start()
{
myAni = GetComponent<PlayerAni>();
// myAni.ChangeAni(PlayerAni.ANI_WALK);
ChangeState(State.Idle, PlayerAni.ANI_IDLE);
}
void ChangeState(State newState, int aniNumber)
{
if (currentState == newState)
{
return;
}
myAni.ChangeAni(aniNumber);
currentState = newState;
}
//캐릭터의 상태가 바뀌면 어떤 일이 일어날지 를 미리 정의
void UpdateState()
{
switch (currentState)
{
case State.Idle:
break;
case State.Move:
TurnToDestination();
MoveToDestination();
break;
case State.Attack:
break;
case State.AttackWait:
break;
case State.Dead:
break;
default:
break;
}
}
//MoveTo(캐릭터가 이동할 목표 지점의 좌표)
public void MoveTo(Vector3 tPos)
{
curTargetPos = tPos;
ChangeState(State.Move, PlayerAni.ANI_WALK);
}
void TurnToDestination()
{
// Quaternion lookRotation(회전할 목표 방향) : 목표 방향은 목적지 위치에서 자신의 위치를 빼면 구함
Quaternion lookRotation = Quaternion.LookRotation(curTargetPos - transform.position);
//Quaternion.RotateTowards(현재의 rotation값, 최종목표rotation 값, 최대 회전각)
transform.rotation = Quaternion.RotateTowards(transform.rotation, lookRotation, Time.deltaTime * rotAnglePerSecond);
}
void MoveToDestination()
{
//Vector3.MoveTowards(시작지점, 목표지점,최대이동거리)
transform.position = Vector3.MoveTowards(transform.position, curTargetPos,moveSpeed * Time.deltaTime);
//플레이어의 위치와 목표지점의 위치가 같으면, 상태를 Idle 상태로 바꾸라는 명령
if (transform.position == curTargetPos)
{
ChangeState(State.Idle, PlayerAni.ANI_IDLE);
}
}
void Update()
{
UpdateState();
}
}
스크립트를 수정하고 플레이 버튼을 눌러서 플레이어가 마우스 클릭지점으로 이동하는지 확인 합니다
'게임 만들기 강좌 > 유니티 3D RPG 게임만들기' 카테고리의 다른 글
unity 유니티 게임 만들기 RPG 게임만들기 8 적 Enemy 만들기 셋업 (0) | 2019.06.29 |
---|---|
unity 유니티 게임 만들기 RPG 게임만들기 7 Player Camera following (0) | 2019.06.28 |
unity 유니티 게임 만들기 RPG 게임만들기 5 PlayerFSM 및 PlayerAni (0) | 2019.06.26 |
unity 유니티 게임 만들기 RPG 게임만들기 4 캐릭터 FMS 및 add Animation (2) | 2019.06.25 |
unity 유니티 게임 만들기 RPG 게임만들기 3 캐릭터 InputManager 만 들기 클릭이동 Click Move (1) | 2019.06.24 |