Saturday, November 27, 2021
Home Khác Người chơi

Người chơi

Người chơi
Đã kiểm tra với phiên bản: 5.5
– –
Độ khó: Trung cấp
Giai đoạn 1 dạy bạn làm thế nào để xây dựng một nhấp chuột để di chuyển nhân vật hoạt hình bằng cách sử dụng EventSystem, NavMesh, Animator và Prefabs. Tải xuống gói nội dung cho Giai đoạn 1 tại đây.
Tải xuống gói nội dung cho giai đoạn này tại đây.https://www.assetstore.unity3d.com/en/?&_ga=2.128951948.1082230255.1536856804-659907597.1536596969#!/content/76783

PlayerMovement

Expand view

Copy code
using System.Collections;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.EventSystems;
public class PlayerMovement : MonoBehaviour
{
public Animator animator;
public NavMeshAgent agent;
public float turnSmoothing = 15f;
public float speedDampTime = 0.1f;
public float slowingSpeed = 0.175f;
public float turnSpeedThreshold = 0.5f;
public float inputHoldDelay = 0.5f;

private Interactable currentInteractable;
private Vector3 destinationPosition;
private bool handleInput = true;
private WaitForSeconds inputHoldWait;
private readonly int hashSpeedPara = Animator.StringToHash("Speed");
private readonly int hashLocomotionTag = Animator.StringToHash("Locomotion");
public const string startingPositionKey = "starting position";
private const float stopDistanceProportion = 0.1f;
private const float navMeshSampleDistance = 4f;
private void Start()
{
agent.updateRotation = false;
inputHoldWait = new WaitForSeconds (inputHoldDelay);
destinationPosition = transform.position;
}
private void OnAnimatorMove()
{
agent.velocity = animator.deltaPosition / Time.deltaTime;
}
private void Update()
{
if (agent.pathPending)
return;
float speed = agent.desiredVelocity.magnitude;

if (agent.remainingDistance <= agent.stoppingDistance * stopDistanceProportion)
Stopping (out speed);
else if (agent.remainingDistance <= agent.stoppingDistance)
Slowing(out speed, agent.remainingDistance);
else if (speed > turnSpeedThreshold)
Moving ();

animator.SetFloat(hashSpeedPara, speed, speedDampTime, Time.deltaTime);
}
private void Stopping (out float speed)
{
agent.Stop();
transform.position = destinationPosition;
speed = 0f;
if (currentInteractable)
{
transform.rotation = currentInteractable.interactionLocation.rotation;
currentInteractable.Interact();
currentInteractable = null;
StartCoroutine (WaitForInteraction ());
}
}
private void Slowing (out float speed, float distanceToDestination)
{
agent.Stop();
float proportionalDistance = 1f - distanceToDestination / agent.stoppingDistance;
Quaternion targetRotation = currentInteractable ? currentInteractable.interactionLocation.rotation : transform.rotation;
transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, proportionalDistance);
transform.position = Vector3.MoveTowards(transform.position, destinationPosition, slowingSpeed * Time.deltaTime);
speed = Mathf.Lerp(slowingSpeed, 0f, proportionalDistance);
}
private void Moving ()
{
Quaternion targetRotation = Quaternion.LookRotation(agent.desiredVelocity);
transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, turnSmoothing * Time.deltaTime);
}
public void OnGroundClick(BaseEventData data)
{
if(!handleInput)
return;

currentInteractable = null;
PointerEventData pData = (PointerEventData)data;
NavMeshHit hit;
if (NavMesh.SamplePosition (pData.pointerCurrentRaycast.worldPosition, out hit, navMeshSampleDistance, NavMesh.AllAreas))
destinationPosition = hit.position;
else
destinationPosition = pData.pointerCurrentRaycast.worldPosition;
agent.SetDestination(destinationPosition);
agent.Resume ();
}
public void OnInteractableClick(Interactable interactable)
{
if(!handleInput)
return;
currentInteractable = interactable;
destinationPosition = currentInteractable.interactionLocation.position;
agent.SetDestination(destinationPosition);
agent.Resume ();
}
private IEnumerator WaitForInteraction ()
{
handleInput = false;
yield return inputHoldWait;
while (animator.GetCurrentAnimatorStateInfo (0).tagHash != hashLocomotionTag)
{
yield return null;
}
handleInput = true;
}
}
RELATED ARTICLES

Hướng dẫn tạo USB Boot cài WIN 7, 10 trên cả 2 chuẩn UEFI và LEGACY

Bạn đang muốn cài lại Windows bằng USB nhưng không biết cách thực hiện như thế nào cho nhanh và đơn giản nhất! Hãy...

Những câu nói hay về giá trị cuộc sống mang thông điệp ý nghĩa

Có khi nào bạn tự hỏi giá trị của cuộc sống là gì không? Mỗi người cần tìm ra giá trị cuộc...

1500++ những câu nói hay về cuộc sống làm thay đổi cuộc đời bạn

Tổng hợp 1500+ những câu nói hay về cuộc sống, stt buồn về cuộc sống hay và ý nghĩa nhất. Những lời hay...

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Most Popular

2000+ những câu nói hay về tình yêu cuộc sống ý nghĩa và sâu sắc nhất

Cuộc sống có vui buồn, giận hờn, thất vọng... Lúc này, những câu nói hay về cuộc sống...

Hướng dẫn tạo USB Boot cài WIN 7, 10 trên cả 2 chuẩn UEFI và LEGACY

Bạn đang muốn cài lại Windows bằng USB nhưng không biết cách thực hiện như thế nào cho nhanh và đơn giản nhất! Hãy...

Cách tải Windows 10, tải file ISO Windows 10 chính thức từ Microsoft

Bạn đang muốn cài mới hoặc cài lại Windows 10, tuy nhiên lại không biết tải Windows 10, file ISO Windows 10 ở...

Hướng dẫn cách cài đặt Windows 10 bằng USB nhanh nhất

Cài đặt Windows 10 có rất nhiều cách như cài đặt bằng đĩa, USB Boot hay thậm chí cài đặt ngay trên ổ...