【问题标题】:How can I add a slowdown effect when object is getting close to a target?当物体接近目标时,如何添加减速效果?
【发布时间】:2020-12-01 23:31:08
【问题描述】:
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using UnityEngine;
using UnityEngine.AI;

public class Waypoints : UnityEngine.MonoBehaviour
{
    public List<Transform> waypoints = new List<Transform>();
    public float movementSpeed = 5.0f;
    public float slowdownSpeed = 1f;
    public float rotationSpeed = 2.0f;
    public float waypointDistance = 0.1f;
    public float slowdownDistance = 7f;
    public bool moveBackward = false;
    public bool moveLoop = false;
    public bool includeTransformPosition = false;

    private Transform targetWaypoint;
    private int targetWaypointIndex = 0;
    private int lastWaypointIndex;
    private bool includeTransform = true;
    private GameObject go;
        
    // Use this for initialization
    void Start()
    {
        go = new GameObject();
        go.transform.position = transform.position;

        if (moveBackward && waypoints.Count > 2)
        {
            lastWaypointIndex = 0;
            targetWaypoint = waypoints[waypoints.Count - 1];
        }
        else
        {
            lastWaypointIndex = waypoints.Count - 1;
            targetWaypoint = waypoints[targetWaypointIndex]; //Set the first target waypoint at the start so the enemy starts moving towards a waypoint
        }
    }

    // Update is called once per frame
    void Update()
    {
        if (includeTransformPosition && includeTransform)
        {
            waypoints.Insert(0,go.transform);
            includeTransform = false;
        }
        else
        {
            if (includeTransformPosition == false)
            {
                waypoints.Remove(go.transform);
                includeTransform = true;
            }
        }

        float movementStep = movementSpeed * Time.deltaTime;
        float rotationStep = rotationSpeed * Time.deltaTime;

        Vector3 directionToTarget = targetWaypoint.position - transform.position;
        Quaternion rotationToTarget = Quaternion.LookRotation(directionToTarget);

        transform.rotation = Quaternion.Slerp(transform.rotation, rotationToTarget, rotationStep);

        float distance = Vector3.Distance(transform.position, targetWaypoint.position);
        CheckDistanceToWaypoint(distance);

        if(slowdownDistance < 7f)
        {
            movementSpeed -= movementSpeed * Time.deltaTime;
        }

        transform.position = Vector3.MoveTowards(transform.position, targetWaypoint.position, movementStep);
    }

    void CheckDistanceToWaypoint(float currentDistance)
    {
        if (currentDistance <= waypointDistance)
        {
            targetWaypointIndex++;
            UpdateTargetWaypoint();
        }
    }

    void UpdateTargetWaypoint()
    {
        if (targetWaypointIndex > lastWaypointIndex)
        {
            targetWaypointIndex = 0;
        }

        targetWaypoint = waypoints[targetWaypointIndex];
    }
}

在这部分我试图减慢移动速度,但它根本没有改变速度:

if(slowdownDistance < 7f)
            {
                movementSpeed -= movementSpeed * Time.deltaTime;
            }

当变换开始移动时我正在尝试做的是将速度缓慢增加到某个恒定速度,然后当变换越来越接近航点时,如果距离小于 7,则将速度降低到 0 所以对象将停在路点处,然后在 X 秒后将变换移回变换原始位置(go.transform),并以相同的递增递减速度移动。

但我什至无法进行第一次简单的减速。

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    您将 slowdownDistance 设置为 7,我没有看到您曾经将其降低到 7 以下,但是您有 if 语句只执行它低于 7 您是否在其他地方将其降低? 您可能计划将 slowdownDistance 与某个距离进行比较,而不是将其与其自身的值进行比较。

    【讨论】:

    • 对,第一个问题是我必须像这样进行检查: if(distance
    • 您可以制作一个“减速因子”,而不是直接减速并在计算该因子时除以距离。这样距离越大,减速因子越小,达到最大减速距离 0(并且您需要按照距离 0 不这样做的方式进行操作)。
    【解决方案2】:

    如果你想减慢整个场景的速度,你可以使用:

    while(distance < range)
    {
       Time.timeScale = 1 - (distance / value);
    }
    

    你可以改变这个值,所以当玩家靠近时,时间会大大减慢。 使用相同的想法,您可以这样做:

    while(distance < range)
    {  
       speed = speedInitial - (distance / value);
    }
    

    如果你只想改变播放器的速度

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-14
      相关资源
      最近更新 更多