繁体   English   中英

当玩家接近航路点时,我将如何使其减速并再次加速?

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM