[英]How can i make that when the player is getting close to a waypoint he will slow down and then will speed up again?
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityStandardAssets.Characters.ThirdPerson;
public class WayPoints : MonoBehaviour {
public GameObject[] waypoints;
public Transform target;
public float moveSpeed = 1f;
public float rotationSpeed = 1f;
private Transform myTransform;
private int targetsIndex = 0;
private Vector3 originalPosition;
public float walkSpeed = 15f;
void Awake()
{
myTransform = transform;
}
// Use this for initialization
void Start()
{
waypoints = GameObject.FindGameObjectsWithTag("ClonedObject");
originalPosition = myTransform.position;
}
// Update is called once per frame
void Update()
{
if (MyCommands.walkbetweenwaypoints == true)
{
WayPointsAI();
}
DrawLinesInScene();
}
private void WayPointsAI()
{
if (targetsIndex == waypoints.Length)
targetsIndex = 0;
target = waypoints[targetsIndex].transform;
float distance = Vector3.Distance(myTransform.position, target.transform.position);
myTransform.rotation = Quaternion.Slerp(myTransform.rotation, Quaternion.LookRotation(target.position - myTransform.position), rotationSpeed * Time.deltaTime);
//move towards the player
myTransform.position += myTransform.forward * moveSpeed * Time.deltaTime;
if (distance < 2f)
targetsIndex++;
if (distance < 5f)
{
moveSpeed = 5;
}
else
{
}
}
void DrawLinesInScene()
{
// draw lines between each checkpoint //
for (int i = 0; i < waypoints.Length - 1; i++)
{
Debug.DrawLine(waypoints[i].transform.position, waypoints[i + 1].transform.position, Color.blue);
}
// draw a line between the original transform start position
// and the current transform position //
Debug.DrawLine(originalPosition, transform.position, Color.red);
// draw a line between current transform position and the next waypoint target
// each time reached a waypoint.
if (target != null)
Debug.DrawLine(target.transform.position, myTransform.position, Color.green);
}
}
我希望當玩家/游戲對象接近下一個航路點時,他會減速,然后當他通過航路點時,將旋轉到下一個航路點的速度uo降至原來的速度后再減速。
所以我補充說:
if (distance < 5f)
{
moveSpeed = 5;
}
else
{
}
但是首先我不確定< 5
是否足以使其變慢,但是讓我們說一秒鍾它已經足夠了,我如何在達到起點並旋轉到下一個點后使其加速? 我可以將原始速度存儲在“ Start
功能的某個變量中,但是可能會出現這樣的情況,用戶在游戲已經運行時更改速度,因此將“原始速度”存儲在“開始”功能中並非一直有效。
以及如何找到陣列航路點半徑中的每個航路點? 現在我將其設置為距離<2
if (distance < 2f)
targetsIndex++;
但是,如果航路點對象半徑大於2,則玩家將停留在該航路點。 所以我認為代替2f檢查應該是距離<waypoints [i] .radius或如何找到半徑。 邏輯是找到每個航路點的半徑,並對照其半徑而不是2f進行檢查。
編輯
這是我的WayPoints腳本。 我向路標數組中的每個路標添加對撞機和SlowDown腳本:
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityStandardAssets.Characters.ThirdPerson;
public class WayPoints : MonoBehaviour {
//setters for setting everything in Unity editor
public float moveSpeedWalkSetter = 10f;
public float moveSpeedSlowedWalkSetter = 3f;
//static objects changeable via any script
public static float moveSpeedWalk;
public static float moveSpeedSlowedWalk;
static ThirdPersonCharacter thirdperson;
public GameObject[] waypoints;
public Transform target;
public float rotationSpeed = 1f;
private Transform myTransform;
private int targetsIndex = 0;
private Vector3 originalPosition;
private GameObject[] robots;
public Transform reverseTarget;
private int reverseTargetsIndex = 0;
private Vector3 reverseOriginalPosition;
//public float walkSpeed = 15f;
void Awake()
{
myTransform = transform;
}
// Use this for initialization
void Start()
{
thirdperson = new ThirdPersonCharacter();
moveSpeedWalk = moveSpeedWalkSetter;
moveSpeedSlowedWalk = moveSpeedSlowedWalkSetter;
thirdperson.ChangeSpeed(moveSpeedWalk);
waypoints = GameObject.FindGameObjectsWithTag("ClonedObject");
robots = GameObject.FindGameObjectsWithTag("Robots");
AddColliderToWaypoints();
AddSlowdownScriptToWaypoints();
originalPosition = robots[0].transform.position;
reverseOriginalPosition = robots[1].transform.position;
}
// Update is called once per frame
void Update()
{
if (MyCommands.walkbetweenwaypoints == true)
{
WayPointsAI();
ReverseWayPointsAI();
}
DrawLinesInScene();
}
public static void SetSpeed(float move)
{
thirdperson.ChangeSpeed(move);
}
private void WayPointsAI()
{
if (targetsIndex == waypoints.Length)
targetsIndex = 0;
target = waypoints[targetsIndex].transform;
float distance = Vector3.Distance(robots[0].transform.position, target.transform.position);
robots[0].transform.rotation = Quaternion.Slerp(robots[0].transform.rotation, Quaternion.LookRotation(target.position - robots[0].transform.position), rotationSpeed * Time.deltaTime);
//move towards the player
robots[0].transform.position += robots[0].transform.forward * moveSpeedWalk * Time.deltaTime;
if (distance < 2f)
targetsIndex++;
}
private void ReverseWayPointsAI()
{
if (reverseTargetsIndex == 0)
reverseTargetsIndex = waypoints.Length -1;
reverseTarget = waypoints[reverseTargetsIndex].transform;
float distance = Vector3.Distance(robots[1].transform.position, reverseTarget.transform.position);
robots[1].transform.rotation = Quaternion.Slerp(robots[1].transform.rotation, Quaternion.LookRotation(reverseTarget.position - robots[1].transform.position), rotationSpeed * Time.deltaTime);
//move towards the player
robots[1].transform.position += robots[1].transform.forward * moveSpeedWalk * Time.deltaTime;
if (distance < 2f)
reverseTargetsIndex--;
}
void RandomWayPointsAI()
{
}
void DrawLinesInScene()
{
// draw lines between each checkpoint //
for (int i = 0; i < waypoints.Length - 1; i++)
{
Debug.DrawLine(waypoints[i].transform.position, waypoints[i + 1].transform.position, Color.blue);
}
// draw a line between the original transform start position
// and the current transform position //
Debug.DrawLine(originalPosition, robots[0].transform.position, Color.red);
Debug.DrawLine(originalPosition, robots[1].transform.position, Color.red);
// draw a line between current transform position and the next waypoint target
// each time reached a waypoint.
if (target != null)
Debug.DrawLine(target.transform.position, robots[0].transform.position, Color.green);
if (reverseTarget != null)
Debug.DrawLine(reverseTarget.transform.position, robots[1].transform.position, Color.green);
}
void AddColliderToWaypoints()
{
foreach (GameObject go in waypoints)
{
SphereCollider sc = go.AddComponent<SphereCollider>() as SphereCollider;
sc.isTrigger = true;
}
}
void AddSlowdownScriptToWaypoints()
{
foreach (GameObject go in waypoints)
{
go.AddComponent<SlowDown>();
}
}
}
然后是SlowDown腳本
using UnityEngine;
using UnityStandardAssets.Characters.FirstPerson;
class SlowDown : MonoBehaviour
{
private void OnTriggerEnter(Collider other)
{
Debug.Log("Object " + other.name + " entered " + name);
WayPoints.SetSpeed(WayPoints.moveSpeedSlowedWalk);
}
private void OnTriggerExit(Collider other)
{
Debug.Log("Object " + other.name + " exited " + name);
WayPoints.SetSpeed(WayPoints.moveSpeedWalk);
}
}
然后在ThirdPersonController腳本中添加此代碼
public void ChangeSpeed(float move)
{
m_MoveSpeedMultiplier = move;
}
現在,我僅使用移動速度變量,而不使用步行速度。 所以我現在只使用移動,因為它是ThirdPersonController而不是FirstPersonController。
但是進入OnTriggerEnter時,它仍然不會減慢速度。
我的想法是,您可以檢查2個檢查點之間的距離是否為內聯,然后計算速度。
var distanceCheckpoint = Vector3.Distance(checpoint_1.position, checpoint_2.position);
var distance = Vector3.Distance(myTransform.position, target.transform.position);
var thresholdSpeed = distance / distanceCheckpoint * moveSpeed;
假設玩家的移動速度因浮動而變化,並且您正在使用統一標准資產3rd First Person Controller。 您可以將其調整為自定義播放器控制器。 無論如何,此腳本要求您在編輯器中設置moveSpeedSetter,moveSpeedSlowedSetter和motorSetter。 您可以將此腳本放在任何喜歡的位置。
using UnityEngine;
public class WayPoints : MonoBehaviour
{
//setters for setting everything in Unity editor
public float moveSpeedSetter = 1f;
public float moveSpeedSlowedSetter = 0.5f;
public CharacterMotor motorSetter;
//static objects changeable via any script
public static float moveSpeed;
public static float moveSpeedSlowed;
public static CharacterMotor motor;
public static void SetSpeed(float speed)
{
motor.movement.maxForwardSpeed = speed;
}
private void Start()
{
moveSpeed = moveSpeedSetter;
moveSpeedSlowed = moveSpeedSlowedSetter;
motor = motorSetter;
motor.movement.maxForwardSpeed = moveSpeed;
}
}
之后,在所有航點中創建一個空對象,並向其添加觸發器。 然后將此腳本放在帶有觸發器的新創建對象上。
using UnityEngine;
class SlowDown : MonoBehaviour
{
private void OnTriggerEnter(Collider other)
{
Debug.Log("Object " +other.name+" entered "+ name);
WayPoints.SetSpeed(WayPoints.moveSpeedSlowed);
}
private void OnTriggerExit(Collider other)
{
Debug.Log("Object " + other.name + " exited " + name);
WayPoints.SetSpeed(WayPoints.moveSpeed);
}
}
---編輯下面的5個團結---
因此,為了從Unity標准資產中輕松地在gameObject FPSController中訪問對象FirstPersonController的float WalkSpeed和RunSpeed浮動,您必須對其進行修改或制作自己的訪問此類對象的方法。 (您可以將其放在FirstPersonController腳本中的任何位置)。
public void ChangeSpeed(float walk,float run)
{
m_WalkSpeed = walk;
m_RunSpeed = run;
}
這是運動速度控制的腳本
using UnityEngine;
using UnityStandardAssets.Characters.FirstPerson;
public class WayPoints : MonoBehaviour
{
//setters for setting everything in Unity editor
public float moveSpeedRunSetter = 10f;
public float moveSpeedSlowedRunSetter = 6f;
public float moveSpeedWalkSetter = 5f;
public float moveSpeedSlowedWalkSetter = 3f;
public FirstPersonController motorSetter;
//static objects changeable via any script
public static float moveSpeedRun;
public static float moveSpeedSlowedRun;
public static float moveSpeedWalk;
public static float moveSpeedSlowedWalk;
public static FirstPersonController motor;
public static void SetSpeed(float walk, float run)
{
motor.ChangeSpeed(walk, run);
}
private void Start()
{
moveSpeedWalk = moveSpeedWalkSetter;
moveSpeedSlowedWalk = moveSpeedSlowedWalkSetter;
moveSpeedRun = moveSpeedRunSetter;
moveSpeedSlowedRun = moveSpeedSlowedRunSetter;
motor = motorSetter;
motor.ChangeSpeed(moveSpeedWalk, moveSpeedRun);
}
}
這是航點的腳本
using UnityEngine;
using UnityStandardAssets.Characters.FirstPerson;
class SlowDown : MonoBehaviour
{
private void OnTriggerEnter(Collider other)
{
Debug.Log("Object " +other.name+" entered "+ name);
WayPoints.SetSpeed(WayPoints.moveSpeedSlowedWalk, WayPoints.moveSpeedSlowedRun);
}
private void OnTriggerExit(Collider other)
{
Debug.Log("Object " + other.name + " exited " + name);
WayPoints.SetSpeed(WayPoints.moveSpeedWalk, WayPoints.moveSpeedRun);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.