0

私は Unity と Javascript を初めて使用し、パズル ゲーム Cryptica をエンジンに慣れるための学習体験として再現しようとしています。OnGUI の 4 つのボタン (左、上、右、下) のいずれかを呼び出すときに、2 つのオブジェクトを同時に移動しようとしています。スクリプトは両方のオブジェクトにアタッチされていますが、移動するのは 1 つだけです。

空のゲーム オブジェクトを作成し、両方のオブジェクトをこれに追加し、スクリプトを空のオブジェクトに配置すると、両方が移動しますが、シナリオごとに異なる方法で各オブジェクトを移動するロジックを作成することはできません (つまり、1 つのオブジェクトがボードの端にある場合、その方向には移動できなくなりますが、別のオブジェクトはまだ移動する可能性があります)。これがコードです。画像がより役立つかどうか教えてください。

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);
    }
}
4

1 に答える 1

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 画面座標に変換してから、画面上にあるかどうかをテストすることです。そのパスにも問題があります。オブジェクトが独自の原点を中心にしていると想定しています。

ああ、「タグ」。ゲームオブジェクトを選択すると、「インスペクター」でタグを見つけることができます。独自のカスタム タグを作成できます。説明については、wiki を参照してください。

于 2012-07-10T14:19:38.653 に答える