Где я должен снова установить флаг в false?

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

public class Follow : MonoBehaviour
{
    public Transform targetToFollow;
    public Text text;
    public float lookAtRotationSpeed;
    public float moveSpeed;

    private float minMoveSpeed = 0f;
    private bool moveInDistance = false;

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

    // Update is called once per frame
    void FixedUpdate()
    {
        Vector3 lTargetDir = targetToFollow.position - transform.position;
        lTargetDir.y = 0.0f;
        transform.rotation = Quaternion.RotateTowards(transform.rotation,
            Quaternion.LookRotation(lTargetDir), Time.time * lookAtRotationSpeed);

        var distance = Vector3.Distance(transform.position, targetToFollow.position);

        text.text = distance.ToString();

        if (distance > 5f && moveInDistance == false)
        {
            moveSpeed = moveSpeed + 0.5f * Time.deltaTime;
        }

        if (distance > 1.5f && distance < 5f)
        {
            moveInDistance = true;
            moveSpeed = moveSpeed + 0.05f;
        }
        else if (distance < 1f)
        {
            moveSpeed = Mathf.Max(minMoveSpeed, moveSpeed - 0.3f);
        }

        transform.position = Vector3.MoveTowards(transform.position, targetToFollow.position, Time.deltaTime * moveSpeed);
    }
}

При первом запуске игры преобразование будет быстрее двигаться к цели в этой части:

if (distance > 5f && moveInDistance == false)
            {
                moveSpeed = moveSpeed + 0.5f * Time.deltaTime;
            }

Затем, когда преобразование достигнет близкого расстояния к цели, он будет продолжать следовать за целью с более низкой скоростью в этой части:

if (distance > 1.5f && distance < 5f)
            {
                moveInDistance = true;
                moveSpeed = moveSpeed + 0.05f;
            }

Проблема в том, что в будущем в игре я снова захочу изменить скорость, если трансформация будет более чем в 5 дистанциях от цели. Тогда где я должен снова изменить флаг moveInDistance на false?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
72
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете немного отредактировать существующий if statement, чтобы включить то, что вам нужно:

if (distance > 5f)
{
  if (moveInDistance == false) {
    moveSpeed = moveSpeed + 0.5f * Time.deltaTime;
  } else {
    moveInDistance = false;
  }
}
Ответ принят как подходящий

Вы можете поставить moveInDistance перед логическим перемещением, например

moveInDistance = distance > 1.5f && distance < 5f; // or other condition

if (distance > 5f && !moveInDistance)
{
    moveSpeed = moveSpeed + 0.5f * Time.deltaTime;
}
if (distance > 1.5f && distance < 5f)
{
    moveSpeed = moveSpeed + 0.05f;
}
else if (distance < 1f)
{
    moveSpeed = Mathf.Max(minMoveSpeed, moveSpeed - 0.3f);
}
...

Добавить пример, если еще для комментария

...

float ms = moveSpeed;

if (distance > 5f)
{
    ms = moveSpeed + 0.5f; //move faster
}
else if (distance < 1f)
{
    ms = Mathf.Max(minMoveSpeed, moveSpeed - 0.3f); // move slower
}else {
    //set your ms (movement speed) when follwer is move in distance range if you don’t need default value that equal moveSpeed here
}

// by default if distance in range of 1-5 ms is equal moveSpeed and IsInRange Case

// move object by using ms value
...

Пс. На мой взгляд, я думаю, что moveInDistance не имеет значения для использования в моем условии if-else, вы можете проверить диапазон расстояний в операторе elseIf вместо того, чтобы установить moveInDistance

Я хочу сделать ту же логику, что и в игре, например, когда за мужчиной следует его собака. Если собака слишком далеко, она должна бежать быстрее, чтобы догнать человека, но если собака близка к человеку, то теперь просто идите «рядом» с человеком. И снова, если в каком-то случае в игре собака слишком далеко, она должна увеличить скорость, чтобы догнать человека, а затем снова идти «рядом» или медленно следовать за человеком.

Sheron Blumental 14.12.2020 08:55

Проблема здесь в том, что при первом запуске игры и расстоянии более 5 будут существовать оба условия, и преобразование достигнет цели, потому что оно увеличит скорость в обоих условиях.

Sheron Blumental 14.12.2020 08:56

Сначала вы можете объявить переменную ms в области fixupdate и установить постоянную скорость в каждом условии вместо того, чтобы изменять значение moveSpeed, чтобы ваше движение было согласованным.

さんですVaya 14.12.2020 09:29

Во-вторых, вы можете установить условие if else, например, пример редактирования ny.

さんですVaya 14.12.2020 09:30

Другие вопросы по теме