【问题标题】:Transforming several objects via OnGui in Unity 3D在 Unity 3D 中通过 OnGui 转换多个对象
【发布时间】:2012-07-09 14:00:31
【问题描述】:

我是 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);
    }
}

【问题讨论】:

    标签: unity3d unityscript


    【解决方案1】:

    在 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 屏幕坐标,然后测试它是否在屏幕上。该路径也有问题,它假设您的对象以它自己的原点为中心。

    哦,还有“标签”。选择任何游戏对象时,可以在“检查器”中找到标签。您可以创建自己的自定义标签。有关说明,请参阅 wiki。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多