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?
Вы можете немного отредактировать существующий 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
Проблема здесь в том, что при первом запуске игры и расстоянии более 5 будут существовать оба условия, и преобразование достигнет цели, потому что оно увеличит скорость в обоих условиях.
Сначала вы можете объявить переменную ms в области fixupdate и установить постоянную скорость в каждом условии вместо того, чтобы изменять значение moveSpeed, чтобы ваше движение было согласованным.
Во-вторых, вы можете установить условие if else, например, пример редактирования ny.
Я хочу сделать ту же логику, что и в игре, например, когда за мужчиной следует его собака. Если собака слишком далеко, она должна бежать быстрее, чтобы догнать человека, но если собака близка к человеку, то теперь просто идите «рядом» с человеком. И снова, если в каком-то случае в игре собака слишком далеко, она должна увеличить скорость, чтобы догнать человека, а затем снова идти «рядом» или медленно следовать за человеком.