光线投射使敌人跳跃

时间:2015-11-19 14:55:08

标签: javascript unity3d artificial-intelligence

如上所述,我正在尝试构建一个简单的游戏,但我似乎无法让敌人正确移动。该游戏是Minecraft风格的基于块的游戏。到目前为止我使用的代码让敌人在我离开一定距离后开始关注我,并在我离开一定距离后停止跟踪。

我对这个剧本的问题是,当我逃离他时,敌人会漂浮到远处。更重要的是,我不能为我的生命让敌人跳起来。我知道我应该为此使用两个Raycast:一个用于检测前方的一个块,这个块会让敌人跳起来,另一个块可以检测到敌人的下方,如果他的脚下没有一个肛门,他会跌到下面的水平?我不知道如何实现这一点,一些帮助将不胜感激。

我到目前为止的代码可以在下面看到:



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);
}
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:0)

设计可以改变很多。这取决于你想要多聪明的AI?应该是多么现实。首先,你应该检查距离,因为我看到你做到了。问题是如果有墙或什么?也许它们彼此如此接近,但它们之间有一道墙。这就是你需要光线投射的原因。所以你从敌人发送光线投射给玩家。如果他们之间没有障碍,我可以决定“我应该来找你”。但这是另一个现实问题。如果它没有找你呢?如果人工智能可以在看到其他地方的时候发现玩家,那就不那么酷吧?因此,您还要检查玩家是否在AI前面。也许我们可以这样做:

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

所以如果dot为-1,我们可以说它直接在后面,+1表示在它前面。那么,现在又是另一个问题如果玩家应该在人工智能的前面被发现,那么人工智能就不能站立得对吗?它应该随机移动和转身。如果你需要它我们可以在以后工作。

现在另一个问题是,如果你隐藏在一个物体后呢?该怎么办?我的意思是当你在跑步的时候,如果你和AI之间发生了什么事情,因为raycast会失败,它会停止跟着你吗?我们能做些什么呢?我的sugesstion存储了AI看到的玩家的最后位置。至少去那里检查AI是否可以找到那里的玩家。如果它不能,它可能会随机移动。通过这样做,我相信它看起来更加真实。

编辑:大声笑我意识到我只是改进了你的设计,忘了回答你究竟问的是什么。

首先,人工智能知道它是否已接地。当我们发送光线投射时,我们需要知道的第一个距离地面我们需要它。

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

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

AI不应该从头部发出一个不像膝盖以下的光线投射。不要发送太远,只需一点距离即可。只是要理解它存在障碍。并发送另一个光线投射,但这次现在低于膝盖。从跳跃高度。如果它没有击中任何东西,我们可以决定有一个障碍(第一个光线播报说,但是AI可以跳过它(第二个光线播报说)。在决定之后,如果AI也接地,这意味着它可以跳过并通过障碍物。

让我们说这是第1部分。如果你想让我继续讲,我可以为你写另一部分。祝你有愉快的一天!