円内の2Dゲームオブジェクトを動的に作成および破棄するスライダーの作成方法

陽気な404

ゲームオブジェクトを互いに均等に離して円状に作成するエディターツールを作成しました(以下のコード)。作成ボタンがあるので、作成が壊される前にパラメータが調整されます。むしろ、シーンビューで動的に行われる変更を確認したいと思います。スライダーを使用して次のパラメーターを調整するにはどうすればよいですか。

  1. オブジェクトカウントスライダーを使用してゲームオブジェクトを作成または破棄し、オブジェクトを同じ角度に保つように調整します

  2. 半径スライダーを変更してゲームオブジェクトを動的に調整する

  3. 角度スライダーを使用して、円上のすべてのオブジェクトを回転させます(ホイールを回転させるなど)。

CircleSpawn

public class CircleSpawn : MonoBehaviour {
    public float radius;
    public int numOfItems;
    public GameObject clonedObject;
    public List<GameObject> spawnedObjects;
}

CircleSpawnEditor

[CustomEditor(typeof(CircleSpawn))]
public class CircleSpawnEditor : Editor
{
    public override void OnInspectorGUI()
    {
        var tar = (CircleSpawn)target;

        //set its values
        tar.radius = EditorGUILayout.FloatField("Radius:", tar.radius);
        tar.numOfItems = EditorGUILayout.IntField("Number of Items:", tar.numOfItems);
        tar.clonedObject = (GameObject)EditorGUILayout.ObjectField(tar.clonedObject,
                   typeof(GameObject), true);

        //Inspector button for creating the objects in the Editor
        if (GUILayout.Button("Create"))
        {
            //clean up old objects
            if (tar.spawnedObjects != null)
            {
                foreach (var ob in tar.spawnedObjects)
                {
                    DestroyImmediate(ob);
                }
            }
            tar.spawnedObjects = new List<GameObject>();

            float angleBetween = 360.0f / tar.numOfItems;
            float angle = 0;
            for (int i = 0; i <= tar.numOfItems; i++)
            {
                //for each object, find a rotation and position
                var rot = Quaternion.Euler(0, 0, angle);
                var localPos = rot * Vector3.right * tar.radius;
                tar.spawnedObjects.Add(Instantiate(tar.clonedObject,
                tar.transform.position + localPos, rot));
                angle += angleBetween;
            }
        }
    }
}
私は飛ぶ

オブジェクトカウントスライダーを使用してゲームオブジェクトを作成または破棄し、オブジェクトを同じ角度に保つように調整します

IntSliderfornumOfItems使用して、次の場合にオブジェクト再作成します。

numOfItems != spawnedObjects.Count

半径スライダーを変更して、ゲームオブジェクトを動的に調整します

Sliderforを使用し、radiusそれが変更されたら、次のように繰り返してspawnedObjects移動します。

pos = rot * Vector3.right * tar.radius

角度スライダーを使用して、円上のすべてのオブジェクトを回転させます(ホイールを回転させるなど)。

Sliderforを使用し、spinそれが変更されたら、次のように繰り返してspawnedObjects回転させます。

rot = Quaternion.Euler(0, 0, tar.spin + angle)

CircleSpawn:

public class CircleSpawn : MonoBehaviour
{
    public float radius, radiusLast, spin, spinLast;
    public int numOfItems;
    public GameObject clonedObject;
    public List<GameObject> spawnedObjects;
}

CircleSpawnEditor:

[CustomEditor(typeof(CircleSpawn))]
public class CircleSpawnEditor : Editor
{
    public override void OnInspectorGUI ()
    {
        var tar = (CircleSpawn)target;    
        EditorGUILayout.LabelField("Radius"); // Set as required
        tar.radius = EditorGUILayout.Slider(tar.radius, 0f, 100f);          
        EditorGUILayout.LabelField("Angle"); // Set as required
        tar.spin = EditorGUILayout.Slider(tar.spin, 0f, 360f);              
        EditorGUILayout.LabelField("Number of Items"); // Set as required
        tar.numOfItems = EditorGUILayout.IntSlider(tar.numOfItems, 0, 36);  
        EditorGUILayout.LabelField("Object");
        tar.clonedObject = (GameObject)EditorGUILayout.ObjectField(tar.clonedObject, 
        typeof(GameObject), true);

        float angle, angleBetween = 360.0f / tar.numOfItems;

        if (tar.spawnedObjects == null)
            tar.spawnedObjects = new List<GameObject>();

        // Solution #1    
        if (tar.spawnedObjects.Count != tar.numOfItems)
        {
            foreach (var ob in tar.spawnedObjects)
                DestroyImmediate(ob);

            tar.spawnedObjects.Clear();
            angle = 0f;

            for (int i = 0; i < tar.numOfItems; i++)
            {
                var rot = Quaternion.Euler(0f, 0f, tar.spin + angle);
                var localPos = rot * Vector3.right * tar.radius;    
                tar.spawnedObjects.Add(Instantiate(tar.clonedObject,
                tar.transform.position + localPos, rot));
                angle += angleBetween;
            }
        }

        // Solutions #2 & 3    
        if (!Mathf.Approximately(tar.spin, tar.spinLast) ||
            !Mathf.Approximately(tar.radius, tar.radiusLast))
        {
            tar.spinLast = tar.spin;
            tar.radiusLast = tar.radius;    
            angle = 0f;

            for (int i = 0; i < tar.numOfItems; i++)
            {
                var rot = Quaternion.Euler(0f, 0f, tar.spin + angle);
                var localPos = rot * Vector3.right * tar.radius;    
                tar.spawnedObjects[i].transform.position = 
                tar.transform.position + localPos;
                tar.spawnedObjects[i].transform.rotation = rot;
                angle += angleBetween;
            }
        }
    }
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ループ内のオブジェクトを作成および破棄する

分類Dev

スライダーを使用してオブジェクトを作成および破棄するにはどうすればよいですか?

分類Dev

Unity2D-2Dゲームでゲームオブジェクトを円の周りで移動および回転させる方法は?

分類Dev

メモリリーク、および実行可能なクラスの奇妙なバグ-オブジェクトを適切に破棄する方法は?

分類Dev

ゲームのさまざまなオブジェクトの 2D 配列を作成する方法

分類Dev

Unity 2D: 破棄 + 新しいゲームオブジェクトのインスタンス化と状態とスプライトの変更

分類Dev

Flutter-プロバイダー、ブロックのライフサイクル、およびストリームをいつ破棄するかを理解する

分類Dev

2D Javaゲームのオブジェクト(スプライト)が異常に動く

分類Dev

2Dゲームで円形のオブジェクトを円形の表面から跳ね返すにはどうすればよいですか?

分類Dev

""の変換を破棄することはできません。ゲームオブジェクトを破棄する場合は、代わりにゲームオブジェクトでdestroyを呼び出してください

分類Dev

2つのAPIゲートウェイに対して同じラムダ関数を呼び出す作成方法

分類Dev

C#およびUnityでinput.getkeydown(KeyCode.Space)を使用してゲームオブジェクトの複製を作成するのに問題がある

分類Dev

ゲーム内のオブジェクト(タンク)の加速を作成する

分類Dev

Retrofit2.0からのJSON応答によって作成されたPOJOクラスオブジェクトをコピーおよび変更する方法

分類Dev

QMLで同じイベントの後に動的オブジェクトを作成/破棄するにはどうすればよいですか?

分類Dev

自動化テストフレームワークのモジュールを作成および作成する方法

分類Dev

オブジェクトの古いインスタンスを破棄し、ループ内で新しいインスタンスを作成します

分類Dev

動的に構築されたラムダ式を使用して動的オブジェクトを作成および設定する方法

分類Dev

配列のゲームオブジェクトを破棄します

分類Dev

ランダムな名前のオブジェクトを作成(および保存)する

分類Dev

ゲームを進めるための効率的なオブジェクトのアクティブ化および非アクティブ化システムを作成するにはどうすればよいですか?

分類Dev

ゲームオブジェクトを破棄するだけでなく、ゲームオブジェクトを変数に保存する方法

分類Dev

ADODBADsDSObjectプロバイダーを使用してLdap検索用に作成されたオブジェクトを適切に破棄する方法

分類Dev

クラスオブジェクトを格納するための動的2D配列の作成

分類Dev

Unity 3dランダム範囲ゲームオブジェクトを破壊する方法は?

分類Dev

2D配列ベースのゲームのセルにオブジェクトをランダムに配置するにはどうすればよいですか?Java

分類Dev

複数のゲームオブジェクトを一度に破棄するにはどうすればよいですか?

分類Dev

別のクラスのオブジェクトを破棄する方法

分類Dev

別のゲームオブジェクトに接触するゲームオブジェクトから名前を取得する(2D)

Related 関連記事

  1. 1

    ループ内のオブジェクトを作成および破棄する

  2. 2

    スライダーを使用してオブジェクトを作成および破棄するにはどうすればよいですか?

  3. 3

    Unity2D-2Dゲームでゲームオブジェクトを円の周りで移動および回転させる方法は?

  4. 4

    メモリリーク、および実行可能なクラスの奇妙なバグ-オブジェクトを適切に破棄する方法は?

  5. 5

    ゲームのさまざまなオブジェクトの 2D 配列を作成する方法

  6. 6

    Unity 2D: 破棄 + 新しいゲームオブジェクトのインスタンス化と状態とスプライトの変更

  7. 7

    Flutter-プロバイダー、ブロックのライフサイクル、およびストリームをいつ破棄するかを理解する

  8. 8

    2D Javaゲームのオブジェクト(スプライト)が異常に動く

  9. 9

    2Dゲームで円形のオブジェクトを円形の表面から跳ね返すにはどうすればよいですか?

  10. 10

    ""の変換を破棄することはできません。ゲームオブジェクトを破棄する場合は、代わりにゲームオブジェクトでdestroyを呼び出してください

  11. 11

    2つのAPIゲートウェイに対して同じラムダ関数を呼び出す作成方法

  12. 12

    C#およびUnityでinput.getkeydown(KeyCode.Space)を使用してゲームオブジェクトの複製を作成するのに問題がある

  13. 13

    ゲーム内のオブジェクト(タンク)の加速を作成する

  14. 14

    Retrofit2.0からのJSON応答によって作成されたPOJOクラスオブジェクトをコピーおよび変更する方法

  15. 15

    QMLで同じイベントの後に動的オブジェクトを作成/破棄するにはどうすればよいですか?

  16. 16

    自動化テストフレームワークのモジュールを作成および作成する方法

  17. 17

    オブジェクトの古いインスタンスを破棄し、ループ内で新しいインスタンスを作成します

  18. 18

    動的に構築されたラムダ式を使用して動的オブジェクトを作成および設定する方法

  19. 19

    配列のゲームオブジェクトを破棄します

  20. 20

    ランダムな名前のオブジェクトを作成(および保存)する

  21. 21

    ゲームを進めるための効率的なオブジェクトのアクティブ化および非アクティブ化システムを作成するにはどうすればよいですか?

  22. 22

    ゲームオブジェクトを破棄するだけでなく、ゲームオブジェクトを変数に保存する方法

  23. 23

    ADODBADsDSObjectプロバイダーを使用してLdap検索用に作成されたオブジェクトを適切に破棄する方法

  24. 24

    クラスオブジェクトを格納するための動的2D配列の作成

  25. 25

    Unity 3dランダム範囲ゲームオブジェクトを破壊する方法は?

  26. 26

    2D配列ベースのゲームのセルにオブジェクトをランダムに配置するにはどうすればよいですか?Java

  27. 27

    複数のゲームオブジェクトを一度に破棄するにはどうすればよいですか?

  28. 28

    別のクラスのオブジェクトを破棄する方法

  29. 29

    別のゲームオブジェクトに接触するゲームオブジェクトから名前を取得する(2D)

ホットタグ

アーカイブ