在Unity 3D中通过OnGui转换多个对象

时间:2012-07-09 14:00:32

标签: unity3d unityscript

我是Unity和Javascript的新手,并尝试重新创建益智游戏Cryptica作为进入引擎的学习体验。当我调用四个OnGUI按钮之一时,我试图同时移动两个对象:左,上,右和下。该脚本已附加到两个对象,但只移动一个。

如果我创建一个空的游戏对象并将两个对象添加到此对象中并将脚本放在空对象上然后都移动,但是我无法创建逻辑来根据不同的场景移动每个对象(即。如果一个物体位于板的末端,它应该不再向那个方向移动,而另一个物体可能仍在移动)。这是代码,让我知道图像是否会更有帮助。

var cubeMovement = 11;

function Update () {

}

function OnGUI () {
    //Move dynamic cubes
    if (GUI.Button (Rect (250,150,50,50), "Up")) {
        transform.Translate(cubeMovement,0,0);
    }

    if (GUI.Button (Rect (350,250,50,50), "Right")) {
        transform.Translate(0,0,-cubeMovement);

    }

    if (GUI.Button (Rect (250,350,50,50), "Down")) {
        transform.Translate(-cubeMovement,0,0);
    }

    if (GUI.Button (Rect (150,250,50,50), "Left")) {
        transform.Translate(0,0,cubeMovement);
    }
}

1 个答案:

答案 0 :(得分:0)

在2个不同的对象上使用此脚本的问题是两个对象都呈现相同的4个按钮。所以你在屏幕上实际上有8个按钮,它就是最后绘制的按钮位于顶部。

更新多个多维数据集的逻辑如下所示:

function CubeVisible(var go: GameObject){
    var screenPos : Vector3 = camera.WorldToScreenPoint (go.transform.position);
    if(screenPos.x < 0) return false;
    if(screenPos.x > Screen.width) return false;

    //Do the same for the y axis

    //Negative-z means the object is behind the camera.
    if(screenPos.z < 0) return false;
    return true;    //return true if the object wasn't outside any bounds.
}
function UpdateCubes(var dir: Vector3){
    var cubes: GameObject[] = GameObject.FindGameObjectsWithTag("cubes"); 

    for (cube in cubes) { 
        var pos = cube.transform.position;
        var new_pos = pos + dir;

        if(CubeVisible(new_pos)==true)
            cube.transform.Translate(dir);
    } 
}

function OnGUI () {
    //Move dynamic cubes
    if (GUI.Button (Rect (250,150,50,50), "Up")) {
        UpdateCubes(Vector3(cubeMovement,0,0));
    }

    if (GUI.Button (Rect (350,250,50,50), "Right")) {
        UpdateCubes(Vector3(0,0,-cubeMovement));
    }

    if (GUI.Button (Rect (250,350,50,50), "Down")) {
        UpdateCubes(Vector3(-cubeMovement,0,0));
    }

    if (GUI.Button (Rect (150,250,50,50), "Left")) {
        UpdateCubes(Vector3(0,0,cubeMovement));
    }
}

我的javascript-fu有点生疏,我是C#家伙所以希望我没有犯过一个愚蠢的错误。以上应该是你正在寻找的。测试对象是否仍在视图中的问题是您的对象是世界坐标,听起来您想知道对象是否在屏幕外。最简单的方法是首先将对象的位置转换为2D屏幕坐标,然后测试它是否在屏幕上。那条路也有问题,它假设你的对象以它自己的起源为中心。

哦和'标签'。选择任何游戏对象时,可以在“检查器”中找到标签。您可以创建自己的自定义标签。请参阅维基以获得解释。