首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我的MoveTowards方法是在Unity中传送。我只想让它慢慢地移动。我做什么好?

我的MoveTowards方法是在Unity中传送。我只想让它慢慢地移动。我做什么好?
EN

Stack Overflow用户
提问于 2020-12-16 02:51:06
回答 2查看 283关注 0票数 1

当你聚集的时候,我正在做一个游戏,但我的MoveTowards方法只是将对象传送到那里或我所要求的位置。我已经创建了自己的MoveTo方法,所以下面是我的3个脚本。一个是IUNit脚本,它是一个接口,包含MoveTo方法:

代码语言:javascript
运行
复制
    using System;
using UnityEngine;

public interface IUnit 
{
    void MoveTo(Vector2 position, float stopDistance, Action onArrivedAtPosition);
}

这是我的单元脚本,它是AI的发展方向:

代码语言:javascript
运行
复制
    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:

代码语言:javascript
运行
复制
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);
}

}

但问题是,它只是传送到这个位置,而不是缓慢移动。请帮帮忙?另外,你如何开始一个动作?

EN

回答 2

Stack Overflow用户

发布于 2021-01-08 11:55:17

可以尝试使用刚体(rb)而不是MoveTo,并执行以下操作:

代码语言:javascript
运行
复制
   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 =线性插值)。

票数 0
EN

Stack Overflow用户

发布于 2021-01-08 13:17:11

这里是你的三个脚本,我对它们做了一些修改以使其正常工作。

IUnit.cs:

代码语言:javascript
运行
复制
using System;
using UnityEngine;

public interface IUnit 
{
    void MoveTo(Vector2 position, float stopDistance, Action onArrivedAtPosition);
}

Unit.cs:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
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,当协程结束时,您只需将操作参数作为函数调用即可。当您的移动完成时,它将简单地调用一个回调函数。

代码语言:javascript
运行
复制
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);"
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65311939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档