C# 当玩家接近一个航路点时,他会减速,然后再加速,我怎么能做到这一点呢?
但是如果航路点对象半径大于2,则玩家将卡在该航路点。因此,我认为,与2f相比,它应该类似于距离<航路点[i]。半径或如何找到半径。逻辑是找到每个路径点的半径,并检查其半径,而不是2f 编辑 这是我的航路点脚本。我正在向waypoints数组中的每个航路点添加碰撞器和减速脚本:C# 当玩家接近一个航路点时,他会减速,然后再加速,我怎么能做到这一点呢?,c#,unity3d,unity5,C#,Unity3d,Unity5,但是如果航路点对象半径大于2,则玩家将卡在该航路点。因此,我认为,与2f相比,它应该类似于距离
if (distance < 2f)
targetsIndex++;
在第三个personcontroller脚本中,我添加了这个
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);
}
}
现在我只使用移动速度变量,而不是行走速度。所以我现在只使用移动,因为它是第三个人控制器,而不是第一个人控制器
但在进入OnTriggerEnter任何路径点时,它仍然不会减速。我的想法是,如果它是内联的,您可以检查两个检查点之间的距离,然后计算速度
public void ChangeSpeed(float move)
{
m_MoveSpeedMultiplier = move;
}
假设玩家移动速度通过浮动改变,并且您使用的是unity standard asset第三第一人称控制器。您可以将其调整到您的自定义播放器控制器。无论如何,此脚本要求您在编辑器中设置moveSpeedSetter、moveSpeedSlowedSetter和motorSetter。你可以把这个脚本放在任何你喜欢的地方
var distanceCheckpoint = Vector3.Distance(checpoint_1.position, checpoint_2.position);
var distance = Vector3.Distance(myTransform.position, target.transform.position);
var thresholdSpeed = distance / distanceCheckpoint * moveSpeed;
之后,在所有航路点中创建空对象,并向其添加触发器。然后使用触发器将此脚本放在新创建的对象上
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;
}
}
——编辑下面的UNITY 5---
因此,为了在Unity standard asset的gameObject FPSController中准确地访问object 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);
}
}
motor和MOTORSETER type应该是什么变量?它是属于Unity标准资产的class CharacterMotor的对象。它是第一人称控制器的组成部分。你可以直接将第一人称控件拖放到编辑器中的相应位置。我在谷歌上搜索了它,发现由于unity 4左右没有CharacterMotor,但我也在编辑器中的资源中搜索到了没有Motor或CharacterMotor。我应该进口一些包裹吗?我已经在Standrad资源中导入了角色,但是没有CharacterMotor。你是对的,我使用了旧项目中的FPS控制器。很抱歉,我编辑了Unity 5 controller的答案。当然,在第行,tridperson=new tridperson(),这样做会创建只存在于内存中的新对象。您需要它是编辑器中的对象。
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);
}
}
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);
}
}