Unity c#:transform.forward使用全局转发而不是本地转发

时间:2014-09-17 18:43:57

标签: c# unity3d artificial-intelligence global

我正在制作一只AI蜘蛛,它会在太靠近墙壁时停止。但是,使用下面的代码只能在面对迷宫的北墙(全局前进)时成功执行Idle()。

我正在使用Unity3D 4.6。

这是我的代码:

using UnityEngine;
using System.Collections;

public class Spider : MonoBehaviour {

    public float movementSpeed, rotationSpeed;

    //Called by game manager after instantiation
    public void SetLocation (MazeCell cell) {
        transform.localPosition = 
            new Vector3(
                cell.transform.localPosition.x,
                5f,
                cell.transform.localPosition.z
                );
        float startingRotation = Mathf.RoundToInt(Random.Range(-0.5f,3.49999f));
        transform.rotation = Quaternion.Euler(0,startingRotation * 90,0);
    }   

    void Update() {
        if (Physics.Raycast(transform.position, Vector3.down, 0.5f)) {
            if (!Physics.Raycast(transform.position, transform.forward, 2)) {
                Walk();
            } else {
                Idle ();
            }
        }
    }

    private void Idle() {
        animation.Play("idle");
    }

    private void Walk() {
        transform.Translate(transform.forward * movementSpeed * Time.deltaTime);
        animation.Play("walk");
    }

    }

编辑:

Debug.Log()来电 Debug. Log () calls

新规范 New Code

2 个答案:

答案 0 :(得分:1)

看起来Spider的前锋是否面向正确的方向?如果蜘蛛太靠近墙壁,那么它应该是空闲的!物理.Raycast将是假的。也许您需要调试这些并确认它们按预期出现。

我在这里做了一些假设,但看起来Spider对象的实例化为y为5.0f,然后在Update调用中,你正在向下方向进行RayCast。如果半个单位的向下方没有碰撞器,那么什么都不会发生。当然,如果有重力和碰撞的地板,这可能会很好。

答案 1 :(得分:0)

我已回答了我自己的问题(但我必须赞扬@ matther-spencer帮助我看到这些可能性并可靠地帮助我)。事实上,问题是一系列问题。

最重要的问题是光线投影的起源很低。这包括地板作为停止的墙壁,因此使蜘蛛无法行走。这也阻止了Raycast向下工作。

但是,最终需要transform.forwardVector3.forward的组合才能获得所需的功能。这是最终的代码:

using UnityEngine;
using System.Collections;

public class Spider : MonoBehaviour {

public float movementSpeed, rotationSpeed;

public void SetLocation (MazeCell cell) {
    transform.localPosition = 
        new Vector3(
            cell.transform.localPosition.x,
            5f,
            cell.transform.localPosition.z
            );
    float startingRotation = Mathf.RoundToInt(Random.Range(-0.5f,3.49999f));
    transform.rotation = Quaternion.Euler(0,startingRotation * 90,0);
}   

void Update() {
    Debug.Log ("updating");
    if (Physics.Raycast(
        new Vector3(transform.position.x, transform.position.y + 0.25f, transform.position.z),
        Vector3.down,
        0.5f)) {
        Debug.Log("downraycheck passed");
        if (!Physics.Raycast(
            new Vector3(transform.position.x, transform.position.y + 0.25f, transform.position.z),
            transform.forward,
            2)) {
            Debug.Log("forwardraycheck passed");
            Walk();
        } else {
            Debug.Log("forwardraycheck failed");
            Idle ();
        }
    }
}

private void Idle() {
    Debug.Log("idling");
    animation.Play("idle");
}

private void Walk() {
    Debug.Log("walking");
    transform.Translate(Vector3.forward * movementSpeed * Time.deltaTime);
    animation.Play("walk");
}

}