javascript - 光线转换使敌人跳跃

标签 javascript unity-game-engine artificial-intelligence

如上所述,我正在尝试构建一个简单的游戏,但我似乎无法让敌人正确移动。该游戏是一款《我的世界》风格的区 block 游戏。到目前为止,我使用的代码使敌人在我进入一定距离时开始跟随我,并在我离开一定距离后停止跟随。

我在这个脚本中遇到的问题是,当我逃离敌人时,敌人会飘到远处。更重要的是,我无论如何也无法让敌人跳下去。我知道我应该为此使用两个光线转换:一个用于检测前方的方 block ,这将使敌人跳跃,另一个用于检测敌人的下方,如果他脚下没有煤矿,则让他落到下面的高度?我不知道如何实现这一点,我们将不胜感激。

到目前为止我的代码如下所示:

var target : Transform; //the enemy's target
var moveSpeed = 3; //move speed
var rotationSpeed = 3; //speed of turning
var range : float=10f;
var range2 : float=10f;
var stop : float=0;
var myTransform : Transform; //current transform data of this enemy

function Awake() {
    myTransform = transform; //cache transform data for easy access/preformance
}
  
function Start() {
    target = GameObject.FindWithTag("1Player").transform; //target the player
}
  
function Update () {
    //rotate to look at the player
    var distance = Vector3.Distance(myTransform.position, target.position);
    if (distance<=range2 &&  distance>=range) {
        myTransform.rotation = Quaternion.Slerp(myTransform.rotation, 
                Quaternion.LookRotation(target.position - myTransform.position),
                rotationSpeed*Time.deltaTime);
    } else if (distance <= range && distance > stop) {
        //move towards the player
        myTransform.rotation = Quaternion.Slerp(myTransform.rotation, 
                Quaternion.LookRotation(target.position - myTransform.position),
                rotationSpeed*Time.deltaTime);
        myTransform.position += myTransform.forward * moveSpeed * Time.deltaTime;
    } else if (distance <= stop) {
        myTransform.rotation = Quaternion.Slerp(myTransform.rotation, 
                Quaternion.LookRotation(target.position - myTransform.position),
                rotationSpeed*Time.deltaTime);
    }
     
    //lock rotation on x and y axis to zero
    myTransform.eulerAngles = new Vector3(0f, myTransform.eulerAngles.y, 0);
}

最佳答案

设计确实可以改变很多。这取决于你想要多聪明的人工智能?它应该是多么现实。首先你应该检查距离,正如我所见你这样做了。问题是如果有墙什么的怎么办?也许他们之间的距离如此之近,但他们之间却隔着一堵墙。这就是您需要光线转换的原因。因此,您将光线转换从敌人发送到玩家。如果他们之间没有障碍,人工智能可以决定“是的,我应该追随你”。但现实中还有另一个问题。如果它不找你怎么办?如果 AI 可以在玩家看向其他地方时发现玩家,那不是很酷吗?所以你还要检查玩家是否在 AI 前面。也许我们可以这样做:

var heading = target.position - transform.position;
var dot: float = Vector3.Dot(heading, transform.forward);

所以如果点是-1,我们可以说它在它的正后面,+1 表示在它的前面。好吧,现在另一个问题。如果玩家应该在AI前面被发现,那么AI就不能忍受吧?它应该随机移动和转动。如果您需要的话,我们可以稍后再做。

现在还有一个问题,如果你躲在一个物体后面怎么办?它应该做什么?我的意思是,当你运行时,如果你和人工智能之间发生了一些事情,因为光线转换会失败,它会停止跟随你,对吗?我们能为它做什么?我的建议存储人工智能看到的玩家的最后位置。至少去那里检查一下AI是否能找到那里的玩家。如果不能,它可能会继续随机移动。我相信通过这样做,它看起来会更加真实。

编辑:哈哈,我意识到我只是改进了你的设计,却忘了回答你到底问什么。

首先AI应该知道自己是否接地。当我们发送光线转换时,我们首先需要知道到地面的距离,我们需要它。

var distanceToGround = GetComponent<Collider>().bounds.extents.y;

function boolean isGrounded(){
   return Physics.Raycast(transform.position, -Vector3.up, distanceToGround + 0, 1);
}

AI 应该发送光线转换,而不是从头部发出光线,而应该从膝盖以下发出光线。不要送得太远,一点距离就足够了。只是理解起来有障碍。并且还发送另一个光线转换,但这次是在膝盖以下。从跳跃高度来看。如果它没有击中任何东西,我们可以确定存在障碍物(第一个光线转换是这么说的),但人工智能可以跳过它(第二个光线转换是这么说的)。确定后,如果AI也接地,则说明它可以跳跃并穿过障碍物。

假设这是第 1 部分。如果您想让我继续讲下去,我可以为您写另一部分。祝你有美好的一天!

关于javascript - 光线转换使敌人跳跃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33807216/

相关文章:

javascript - 用于计算器操作数和运算符的 JS 正则表达式

javascript - 有没有办法可以将 mongodb 集合作为有序列表发送到 ejs 文件?

javascript - 无法获取列表的长度

unity-game-engine - Unity3d 无法在 Mac OS high Sierra 上正常工作

algorithm - 精确隐马尔可夫模型训练算法

machine-learning - 如何将此 keras cnn 模型转换为 pytorch 版本

Javascript 图形可视化库

android - 适用于 Android 的 Unity Google Play 游戏,Xcode 中的 +200 错误

ios - 如何安装ipa文件(不越狱)

python - 逻辑回归中的微调参数