首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AI回归原点

AI回归原点
EN

Stack Overflow用户
提问于 2018-03-15 04:12:23
回答 1查看 56关注 0票数 0

我要我的敌人回到起点位置。他跟着我直到我离开他的范围然后他就停了下来。我还想让我的骨骼停下来5秒,然后回到起点,你有什么想法吗?我从来没有做过任何涉及时间的事情,除了停止它。

下面是我为敌人编写的脚本:

这也是骨骼上的检查员的截图:enemy

下面是我为敌人编写的脚本:

代码语言:javascript
复制
 using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class chase : MonoBehaviour
{
    public Transform player;
    private Animator anim;
    public float LookRadius = 15f;
    public Transform enemyStartPos;
    // Use this for initialization
    void Start()
    {
        anim = GetComponent<Animator>();
        this.enemyStartPos.position = this.transform.position;
    }

    // Update is called once per frame
    void Update()
    {
        if (!PauseMenu.GameIsPaused)
        {
            if (Vector3.Distance(player.position, this.transform.position) < 15)
            {
                Vector3 direction = player.position - this.transform.position;
                direction.y = 0;
                this.transform.rotation = Quaternion.Slerp(this.transform.rotation, Quaternion.LookRotation(direction), 0.1f);

                anim.SetBool("isIdle", false);
                if (direction.magnitude > 3)
                {
                    this.transform.Translate(0, 0, 0.05f);
                    anim.SetBool("isWalking", true);
                    anim.SetBool("isAttacking", false);
                }
                else
                {
                    anim.SetBool("isAttacking", true);
                    anim.SetBool("isWalking", false);
                }

            }
            else
            {
                if (Vector3.Distance(this.enemyStartPos.position, this.transform.position) >1)
                {
                    Vector3 direction = this.enemyStartPos.position - this.transform.position;
                    direction.y = 0;
                    this.transform.rotation = Quaternion.Slerp(this.transform.rotation, Quaternion.LookRotation(direction), 0.1f);

                    anim.SetBool("isIdle", false);
                    if (direction.magnitude > 1)
                    {
                        this.transform.Translate(0, 0, 0.05f);
                        anim.SetBool("isWalking", true);
                        anim.SetBool("isAttacking", false);
                    }
                }
                else
                anim.SetBool("isIdle", true);
                anim.SetBool("isAttacking", false);
                anim.SetBool("isWalking", false);
            }
        }
    }

    private void OnDrawGizmosSelected()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawWireSphere(transform.position, LookRadius);
    }

}
EN

回答 1

Stack Overflow用户

发布于 2018-03-15 04:30:56

在您尝试对此进行“编码”之前,请考虑一下您的程序设计。您已经设计并实现了这样的行为:“如果机器人的位置与玩家的位置在X个单位之内,则旋转机器人并将其向玩家移动”。

你所描述的下一步要做的事情也可以用同样的方式来考虑(这应该会导致类似的代码)。否则,如果机器人的位置不在玩家位置的X单位内,则旋转机器人并将其移向原点。注意,这意味着你需要定义机器人的原点是什么。重点是,无论你是向玩家移动还是向某个任意的固定点移动,在代码中都没有区别。将一个转换移动到另一个转换的代码是相同的。

对于“漫游”来说,它本质上是相同的思维过程:如果机器人在原点的X个单位内,并且没有跟随玩家,选择一个随机的方向并朝那个方向移动。(更好的是,选择一个随机的方向,并以这种方式移动一段时间,这样你的机器人就不会只是在原点附近抖动)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49286871

复制
相关文章

相似问题

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