为了账号安全,请及时绑定邮箱和手机立即绑定

移动游戏对象

移动游戏对象

C#
红糖糍粑 2021-10-24 17:48:18
我正在尝试使用刚体创建 MOB AI。我想让暴徒(GameObject)使用mobrigid.AddForce((((goal - transform.position).normalized)*speed * Time.deltaTime));(目标是暴民周围的一个随机地方)。这就是它变得复杂的地方,一些暴徒以极快的速度在空中飞行,而另一些则以低速正常移动。(是的,我确实确保目标。Y 是在地面上而不是空中)。我尝试通过改变阻力来修复它,但这会导致暴徒在空中行走而不会因重力而下落。我真的很迷茫,不知道如何简单地用刚体移动游戏对象而不会出现这种奇怪的行为。怪物日志(目标 Y 更改为 0): 编辑:暴徒的形象:我的运动逻辑:   case MOBTYPE.EARTHMOB:            switch (currentstatus)            {                case MOBSTATUS.STANDING:                        if (mobrigid.IsSleeping())                        {                            mobrigid.WakeUp();                        }                           goal = this.transform.position;                            goal.x = Random.Range(goal.x - 150, goal.x + 150);                            goal.z = Random.Range(goal.z -150, goal.z + 150);                    goal.y = 0;                                    currentstatus = MOBSTATUS.WALKING;                 //   Debug.Log("Transform:"+this.transform.position+ "Goal:" + goal+ "goal-transform:" + (goal - transform.position));                    break;                case MOBSTATUS.WALKING:                    if (Random.Range(1, 100) == 5)                    {                        currentstatus = MOBSTATUS.STANDING;                    }                    if (mobrigid.IsSleeping())                    {                        mobrigid.WakeUp();                    }                    mobrigid.AddForce((((goal - transform.position).normalized) * 10000 * Time.deltaTime));                    // transform.LookAt(goal);                    var distance = Vector3.Distance(goal, gameObject.transform.position);                    if (distance <=5)                    {                        currentstatus = MOBSTATUS.STANDING;                    }                    break;            }            break;地形图:
查看完整描述

1 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

该Rigidbody.AddForce函数用于沿某个方向向对象添加力。由于您有一个需要移动Rigidbody到的位置,因此您必须使用该Rigidbody.MovePosition功能。您可能还想将刚体标记为运动学。


将 Rigidbody 对象移动到特定位置的简单协程函数:


IEnumerator MoveRigidbody(Rigidbody rb, Vector3 destination, float speed = 50f)

{

    const float destThreshold = 0.4f;


    while (true)

    {

        Vector3 direction = (destination - rb.position).normalized;

        rb.MovePosition(rb.position + direction * speed * Time.deltaTime);


        float dist = Vector3.Distance(rb.position, destination);


        //Exit function if we are very close to the destination

        if (dist <= destThreshold)

            yield break;


        yield return null;

        //yield return new WaitForFixedUpdate();

    }

}

最好从另一个 coorutine 函数调用它,以便您可以让步或等待它完成,然后执行其他任务,例如再次生成随机位置并将刚体移动到那里。


您想生成新位置然后将其移动到Rigidbody那里,这是如何调用上述函数的示例:


IEnumerator StartMoveMent()

{

    Rigidbody targetRb = GetComponent<Rigidbody>();


    while (true)

    {

        //Generate random position

        Vector3 destination = new Vector3();

        destination.y = 0;

        destination.x = UnityEngine.Random.Range(0, 50);

        destination.z = UnityEngine.Random.Range(0, 50);


        //Move and wait until the movement is done

        yield return StartCoroutine(MoveRigidbody(targetRb, destination, 30f));

    }

}

并启动该StartMoveMent功能:


void Start()

{

    StartCoroutine(StartMoveMent());

}

虽然我上面所说的应该可行,但我建议您使用 Unity 的内置寻路系统。这是一个教程。它简化了寻找通往目的地的路径,NavMesh也可以使用baked during run-time.


查看完整回答
反对 回复 2021-10-24
  • 1 回答
  • 0 关注
  • 156 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信