当你聚集的时候,我正在做一个游戏,但我的MoveTowards方法只是将对象传送到那里或我所要求的位置。我已经创建了自己的MoveTo方法,所以下面是我的3个脚本。一个是IUNit脚本,它是一个接口,包含MoveTo方法:
using System;
using UnityEngine;
public interface IUnit
{
void MoveTo(Vector2 position, float stopDistance, Action onArrivedAtPosition);
}
这是我的单元脚本,它是AI的发展方向:
using UnityEngine;
public class Unit: MonoBehaviour, IUnit
{
public float speed;
public void MoveTo(Vector2 position, float stopDistance, System.Action arrivedAtPosition)
{
if (Vector2.Distance(transform.position, position) >= stopDistance)
{
transform.position = Vector2.MoveTowards(transform.position, position, speed * Time.deltaTime);
}
}
}
然后是激活脚本的GathererAI:
using UnityEngine;
[RequireComponent(typeof(Unit))]
public class GathererAI : MonoBehaviour
{
public Transform treeNode;
public Transform storageNode;
public IUnit unit;
private void Start()
{
unit = gameObject.GetComponent<IUnit>();
unit.MoveTo(treeNode.position, 10f, null);
}
}
但问题是,它只是传送到这个位置,而不是缓慢移动。请帮帮忙?另外,你如何开始一个动作?
发布于 2021-01-08 11:55:17
可以尝试使用刚体(rb)而不是MoveTo,并执行以下操作:
public Rigidbody2D rb;
public float speed, acceleration;
public Transform goHere;
void FixedUpdate()
{
Vector3 direction = goHere.position - transform.position;
direction = direction.normalized;
Vector3 targetVelocity = new Vector3(direction.x * speed, direction.y * speed);
rb.velocity = Vector3.Lerp(rb.velocity, targetVelocity, acceleration);
}
除非你不想使用刚体,在这种情况下,你仍然应该有一个目标向量(方向或位置),并以类似的方式向该位置进行Lerp ( Lerp =线性插值)。
发布于 2021-01-08 13:17:11
这里是你的三个脚本,我对它们做了一些修改以使其正常工作。
IUnit.cs:
using System;
using UnityEngine;
public interface IUnit
{
void MoveTo(Vector2 position, float stopDistance, Action onArrivedAtPosition);
}
Unit.cs:
using UnityEngine;
public class Unit: MonoBehaviour, IUnit
{
public float speed = 5;
public void MoveTo(Vector2 position, float stopDistance, System.Action arrivedAtPosition)
{
if (Vector2.Distance(transform.position, position) >= stopDistance)
{
transform.position = Vector2.MoveTowards(transform.position, position, speed * Time.deltaTime);
}
}
}
GatheredAI.cs:
using UnityEngine;
[RequireComponent(typeof(Unit))]
public class GathererAI : MonoBehaviour
{
public Transform treeNode;
public Transform storageNode;
public IUnit unit;
private void Start()
{
unit = gameObject.GetComponent<IUnit>();
// unit.MoveTo(treeNode.position, 10f, null);
}
void Update()
{
unit.MoveTo(treeNode.position, 10f, null);
}
}
通常在重复的函数中调用Vector2.MoveTowards,而您的函数只被调用一次。你的速度对于你的身体应该走的距离来说可能有点太高了,所以它只是在那个单一的呼叫中传送了。
此外,在这种情况下调用Action并不理想,因为您不是在单个调用中完成完整的移动。为此,您需要将此MoveTo函数转换为协程,可能是循环遍历Vector2.MoveTowards,当协程结束时,您只需将操作参数作为函数调用即可。当您的移动完成时,它将简单地调用一个回调函数。
public void MoveTo(Vector2 position, float stopDistance, System.Action arrivedAtPosition)
{
// your move logic here....
arrivedAtPosition();
//if you need to pass some argument say a bool, then change function parameter as "Action<bool> arrivedAtPosition" and call "arrivedAtPosition(true);"
}
https://stackoverflow.com/questions/65311939
复制相似问题