[英]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.