C# 当玩家接近一个航路点时,他会减速,然后再加速,我怎么能做到这一点呢?

C# 当玩家接近一个航路点时,他会减速,然后再加速,我怎么能做到这一点呢?,c#,unity3d,unity5,C#,Unity3d,Unity5,但是如果航路点对象半径大于2,则玩家将卡在该航路点。因此,我认为,与2f相比,它应该类似于距离

但是如果航路点对象半径大于2,则玩家将卡在该航路点。因此,我认为,与2f相比,它应该类似于距离<航路点[i]。半径或如何找到半径。逻辑是找到每个路径点的半径,并检查其半径,而不是2f

编辑

这是我的航路点脚本。我正在向waypoints数组中的每个航路点添加碰撞器和减速脚本:

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);
    }
}