using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[ExecuteInEditMode]
public class GameManager : MonoBehaviour
{
public GameObject prefabToDraw;
[Range(0, 100)]
public int amountOfObjects;
private int amountCopy;
// Use this for initialization
void Start()
{
amountCopy = amountOfObjects;
prefabToDraw.tag = "DrawPrefab";
}
// Update is called once per frame
void Update()
{
if (amountOfObjects > amountCopy && amountCopy != amountOfObjects)
{
for (int i = 0; i < amountOfObjects; i++)
{
Instantiate(prefabToDraw);
}
amountCopy = amountOfObjects;
}
if (amountOfObjects == 0)
{
var gos = GameObject.FindGameObjectsWithTag("DrawPrefab");
for (int i = 0; i < gos.Length; i++)
{
DestroyImmediate(gos[i]);
}
}
}
}
この部分がないと、オブジェクトを作成する場合にのみ正常に機能します。
if (amountOfObjects == 0)
{
var gos = GameObject.FindGameObjectsWithTag("DrawPrefab");
for (int i = 0; i < gos.Length; i++)
{
DestroyImmediate(gos[i]);
}
}
しかし、スライダーが右に移動しているときに、より多くのオブジェクトがより多くの新しいオブジェクトを作成し、これが機能しているときに、それを実行したいと思います。
スライダーを左に移動するときは、オブジェクトの量を減らしてからオブジェクトを破棄します。たとえば、オブジェクトが90個あり、スライダーの値が90の場合、スライダーを左に移動すると、90から70に移動するとオブジェクトの破棄が開始されます。再び右に移動すると、20個のオブジェクトが破壊され、新しいオブジェクトが再度作成されます。
破壊部分のやり方がわかりません。
私は試した:
if (amountOfObjects == 0)
{
var gos = GameObject.FindGameObjectsWithTag("DrawPrefab");
for (int i = 0; i < gos.Length; i++)
{
DestroyImmediate(gos[i]);
}
}
しかし、「DrawPrefab」というタグが付いたオブジェクトが1つでもあると、0でなくても、オブジェクトは破棄されます。私はそれを台無しにしました。
更新
これは私が試したものです:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[ExecuteInEditMode]
public class GameManager : MonoBehaviour
{
public GameObject prefabToDraw;
[Range(0, 100)]
public int amountOfObjects;
private int amountCopy;
private List<GameObject> gos = new List<GameObject>();
// Use this for initialization
void Start()
{
amountCopy = amountOfObjects;
}
// Update is called once per frame
void Update()
{
CreateObjects();
DestroySomeObjects(amountOfObjects);
}
private void CreateObjects()
{
if (amountOfObjects > amountCopy && amountCopy != amountOfObjects)
{
for (int i = 0; i < amountOfObjects; i++)
{
GameObject go = Instantiate(prefabToDraw);
gos.Add(go);
}
amountCopy = amountOfObjects;
}
}
private void DestroySomeObjects(int amountFromRightSide)
{
if (gos.Count != 0)
{
for (int i = gos.Count - 1; i <= gos.Count - amountFromRightSide; i--)
{
DestroyImmediate(gos[i]);
}
}
}
private void DestroyAllObjects()
{
if (gos.Count != 0)
{
foreach (GameObject go in gos)
{
DestroyImmediate(go);
}
}
}
}
スライダーを右に移動すると、新しいオブジェクトが作成および追加されますが、左に移動すると、例外が発生します。ArgumentOutOfRangeException:引数が範囲外です。パラメータ名インデックス。
行で:
DestroySomeObjects(amountOfObjects);
そして
DestroyImmediate(gos[i]);
常に同じ量のオブジェクトがある場合は、パフォーマンスが向上するため、オブジェクトを破棄するのではなく、有効/無効にすることをお勧めします。
また、後で別のメソッドでオブジェクトを見つけるのではなく、作成したオブジェクトをリストに保存して、それらを参照できるようにします。
List<GameObject> gos = new List<GameObject>();
void CreateObjects()
{
if (amountOfObjects > amountCopy && amountCopy != amountOfObjects)
{
for (int i = 0; i < amountOfObjects; i++)
{
GameObject go = Instantiate(prefabToDraw);
gos.Add(go);
}
amountCopy = amountOfObjects;
}
}
そうすれば、破壊したり他のことをしたりするときにリストを使用できます。
void DestroySomeObjects(int amountFromRightSide)
{
if (gos.Count != 0)
{
for (int i = gos.Count-1; i <= gos.Count-amountFromRightSide; i--)
{
DestroyImmediate(gos[i]);
}
}
}
void DestroyAllObjects()
{
if (gos.Count != 0)
{
foreach (GameObject go in gos)
{
DestroyImmediate(go);
}
}
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加