Как я могу медленно остановить скорость ходьбы персонажа до 0, прежде чем прикоснуться к двери? - PullRequest
0 голосов
/ 27 января 2019
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Collision : MonoBehaviour
{
    public GameObject door;
    public Animator character;
    public DoorsLockManager doorslockmanager;

    private float speed;

    private void OnTriggerEnter(Collider other)
    {
        if(other.name == door.name &&
           doorslockmanager.locked == true)
        {
            character.SetFloat("Walking Speed", speed);
        }
    }

    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        float distanceFromTarget = Vector3.Distance(character.transform.position, door.transform.position);

        if (distanceFromTarget < 3)
        {
            speed = (distanceFromTarget / 10) / 1;
        }
    }
}

В этом случае я проверяю расстояние 3 от двери.Персонаж медленно снижает скорость ходьбы.Но это никогда не останавливает персонажа, продолжайте медленно идти через дверь.

Я хочу, чтобы персонаж, например, если он начинает замедляться на расстоянии 3 от двери, а затем останавливает скорость ходьбы 0 на расстоянии 1 или 0,5f

Хватит ходить немного перед дверью.И не просто внезапно прекратить ходить, а медленно снизить скорость до 0.

Это рабочий скрипт.Но я все еще немного запутался в части вычисления скорости:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Collision : MonoBehaviour
{
    public GameObject door;
    public Animator character;
    public DoorsLockManager doorslockmanager;

    private float speed = 0;
    private bool triggered = false;

    private void OnTriggerEnter(Collider other)
    {
        if (other.name == door.name &&
           doorslockmanager.locked == true)
        {
            triggered = true;
        }

        if(doorslockmanager.locked == false)
        {
            triggered = false;
        }
    }

    // Update is called once per frame
    void Update()
    {
        float distanceFromTarget = Vector3.Distance(character.transform.position, door.transform.position);

        if (triggered == true)
        {
            speed = (distanceFromTarget / 10);
            character.SetFloat("Walking Speed", speed);
            character.SetBool("Idle", true);
        }
    }
}

Эта строка:

speed = (distanceFromTarget / 10);

Кажется, что персонаж вместо этого слишком медленно замедляется в первый размедленно замедляй плавную ходьбу * 1014

1 Ответ

0 голосов
/ 27 января 2019

вы можете попробовать сопоставить расстояние между maxDistance (3) и minDistance (1) с коэффициентом скорости от 1 до 0 ( см. Здесь ):

public float minDistance;
public float maxDistance;
private float initialSpeed;

private void Update()
{
    float distanceFromTarget = Vector3.Distance(character.transform.position, door.transform.position);

    ClampSpeed(distanceFromTarget);
}


private void DampSpeed(float distance)
{
    // value between minDistance and maxDistance 
    // 1-3 in your case
    var clampedDistance = Mathf.Clamp(distance, minDistance, maxDistance);

    // This gives you a value between 0-1
    // where 1 means distance >= maxDistance
    // 0 means distance <= minDistance
    var mapped = (x - minDistance) / (maxDistance - minDistance);

    speed = initialSpeed * mapped;
    character.SetFloat("Walking Speed", speed);
}

Вам все равно нужно как-то получить начальную скорость и быть осторожным, когда включать и отключать этот кодовый блок, потому что вы не сможете убежать от двери, когда будете к ней приближаться;)

Может выглядеть как

// Flag for enabling and disabling damping
private bool enableDamping;

// speed with which the player passed the 3m mark
private float initialSpeed;

private void Update()
{
    float distanceFromTarget = Vector3.Distance(character.transform.position, door.transform.position);

    if(distanceFromTarget > maxDistance)
    {
        // while far away only remember current speed and do nothing else
        initialSpeed = speed;
        enableDamping = true;
    }
    else if (distanceFromTarget <= maxDistance && distanceFromTarget > minDistance)
    {
        if(enableDamping)
        {
            DampSpeed(distanceFromTarget);
        }
    }
    else
    {
        if(enableDamping)
        {  
            // now speed should be zero but just to be sure
            speed = 0;
            character.SetFloat("Walking Speed", speed);
            // and the player minDistance from the door
            // you might want to disable the damping now so you can still move away again.
            enableDaming = false;
        }
    }
}

Обратите внимание, что это все еще может происходить в странных ситуациях, потому что если вы войдете в диапазон 3 м с очень низкой скоростью, это может занять некоторое время, пока вы, наконец, не достигнете 1 м и не сможете снова двигаться ...

Но я надеюсь, что это дает вам представление

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...