簡體   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