【问题标题】:Unity - Enemy AI; Run away from player (x and y)团结 - 敌人 AI;逃离玩家(x 和 y)
【发布时间】:2015-01-17 11:36:15
【问题描述】:

我需要一些帮助来为我的游戏中的敌人创建脚本!我正在制作一个 2.5D 游戏,您可以在其中追逐露营者并试图杀死他们。我基本上玩完了游戏,但我无法让 AI 工作!几天来我一直在四处寻找脚本和帮助,但找不到适合我游戏其余部分的任何内容...请帮助!

对于我的地面,我有一个在 x 轴上旋转 35 度的平面,到目前为止,这对我来说效果很好(移动角色并放置障碍物)。

此时我正在编写这个脚本;

#pragma strict

//Attack button
var attackButton : Joystick;

var anim : Animator;
var delay = 5.0;

//Player can kill
var CanKill = false;

//Score
var scoreValue : int;
var killValue : int;
var playerControl : PlayerControl;

//AI
var speed : int = 2;
var Damp: float = 1.0;

var isRun: boolean = false;
var Target: Transform;

var detectionRange: int = 5;

private var character : CharacterController;

function Start () 
{

    anim = GetComponent("Animator");
    var playerControlObject : GameObject = GameObject.FindWithTag ("Player");

    character = GetComponent(CharacterController);


}

function WaitAndDestroy()
{

    yield WaitForSeconds(delay);
        Destroy (gameObject);

}

function Update()
{

    //Can the player kill?
    if (attackButton.tapCount == 1)
        CanKill = true;

    else CanKill = false; 

    //AI
    var FromPlayer =  Vector3(Target.position.x - transform.position.x, 0);

        if(FromPlayer.magnitude <= detectionRange){
            isRun = true;
        }

        if(FromPlayer.magnitude >= detectionRange) {
            isRun = false;
        }

        if(isRun) {
            RunAway();
            anim.SetBool("Walk", true);
        }

        else anim.SetBool("Walk", false);


}

function OnTriggerEnter (Other : Collider){

    if(Other.gameObject.tag == "Player" && CanKill == true) {
        playerControl.AddScore (scoreValue);
        playerControl.AddKills (killValue);
        anim.SetTrigger("Dead");
        WaitAndDestroy();
    }

}

function RunAway()
{

    var moveDirection : Vector3 = transform.position;
    character.Move(moveDirection.normalized * speed * Time.deltaTime);

}`

这有点用,但由于某种原因,角色在关卡中间停了下来,然后就地跑了……如果我(玩家)抓住他并跑了,我也希望他转身向另一个方向跑在他前面。 (如果代码有点乱,我很抱歉,但正如我所说,我是 Javascript 新手)。

【问题讨论】:

    标签: android unity3d 2d artificial-intelligence unityscript


    【解决方案1】:

    我会做这两个改变。

    起初:

    var FromPlayer =  transform.position - Player.transform.position;
    

    因为你想减去整个向量而不仅仅是 x 坐标 第二:

    function RunAway( FromPlayer :vector3 )
    {
        character.Move(FromPlayer.normalized * speed * Time.deltaTime);
    }
    

    如果你已经有矢量FromPlayer,你可以直接用它来移动角色

    我个人从未使用过统一,但这是你在其他任何地方都会这样做的方式。它当然假设位置可以作为向量减去

    【讨论】:

    • 您能否详细说明您的 FromPlayer 行?这对我来说没有多大意义,因为玩家是我脚本中的目标。
    • 哦,好吧,transform是敌人?你是目标?
    • 这个脚本附在露营者(敌人)身上。目标设置为玩家(我)。我不确定你的意思是“转换”应该是谁,抱歉。不过我会看看这个,看看它是否可以工作,谢谢!
    • 我明白了,当然,它与下面的解决方案相同。祝你好运
    【解决方案2】:

    你想让营员们从玩家身边逃跑,对吧?那你应该做

    Vector3 moveDirection = transform.position - Player.transform.position
    

    为了得到他们应该跑的方向。然后做你已经有的线

    character.Move(moveDirection.normalized * speed * Time.deltaTime);
    

    【讨论】:

    • 这会让它们在 x 和 y 轴上运行吗?
    • transform.position 是 Vector3 所以是的。通过从露营者的位置中减去玩家的位置,您可以得到 3d 空间中两个位置之间的差异(如果两个位置的 z 轴相同,那么它只是一个 2d 差异)。这个得到的向量,经过归一化后,就是露营者为了远离玩家而应该跑的方向。
    • 这在一定程度上可行,但是你给我的 moveDirection 线导致露营车穿过地面,出于某种原因......
    • 这意味着玩家和露营者的Z轴不一样。在规范化之前尝试将 moveDirection 的 Z 值设置为当前 Z 值。在 C# 中是 moveDirection = new Vector3(moveDirection.x, moveDirection.y, transform.position.z);我不熟悉 javascript,但它可以像 moveDirection.z = transform.position.z; 一样简单
    • 成功了!露营车现在与地面发生碰撞,现在唯一的问题是他粘在山脚下,只能沿着 x 轴运行。不过,我可能迟早会弄清楚,感谢您的所有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多