已经2天了,我试图解决这个问题,但我做不到。我正在尝试删除无限的产卵障碍,当它们发生冲突时,boundary.The障碍是由5个cubes.Any想法构成的吗?



public List<GameObject> spawning=new List<GameObject>();
public Vector3[] positions = new Vector3[5];
public GameObject barrier;
public GameObject boundary;
void Start()
{
StartCoroutine (SpawnBarrier());
}
void Update()
{
if(true)
{
foreach (GameObject move in spawning)
move.transform.Translate (0f, 0f, -0.1f);
}
}
IEnumerator SpawnBarrier(){
yield return new WaitForSeconds (3f);
while (true) {
for(int i=0;i<=4;i++)
{
spawning.Add (Instantiate (barrier, positions [i], Quaternion.identity)as GameObject);
}
yield return new WaitForSeconds (3f);
}
}发布于 2018-04-15 21:13:34
您的障碍物在其对撞器上被标记为isTrigger,因此您可以使用OnTriggerEnter来检测任何障碍物何时与边界发生碰撞。
您需要创建新的脚本,让我们调用该BoundaryDetector并将其附加到屏障预制件,以便屏障的每个实例都将此脚本附加到它。
当调用OnTriggerEnter时,检查触发器是否由边界触发。这可以通过检查" Player“标签来完成,因为边界在你的屏幕截图中被标记为Player。如果检测到的触发器标签是"Player",请先从派生列表中删除该派生,然后对其执行Destroy操作。
BoundaryDetector脚本如下所示(必须附加到屏障预制件上):
ScriptFromYourQuestion yourInstancingSript;
void Start()
{
GameObject obj = GameObject.Find("NameOfObjectScriptInYourQuestionIsAttachedTo");
yourInstancingSript = obj.GetComponent<ScriptFromYourQuestion>();
}
void OnTriggerEnter(Collider other)
{
//Detect if we collided with the boundary
if (other.CompareTag("Player"))
{
//Remove Self/barrier from the List
yourInstancingSript.spawning.Remove(this.gameObject);
//Delete Self/barrier
Destroy(this.gameObject);
}
}注意:问题中的ScriptFromYourQuestion应该替换为脚本的名称。
必须执行
要使上面的代码正常工作,必须在您的问题中脚本的Update函数中进行以下更改:
1.You必须将Rigidbody附加到至少一个对象(边界或屏障)。在这种情况下,我建议你这样做的屏障预制件。
2.You必须删除move.transform.Translate (0f, 0f, -0.1f);并用Rigidbody.MovePosition替换它,并使用它来移动屏障,因为您现在已经将Rigidbody附加到屏障上,这是移动Rigidbody对象的正确方法。
可能是这样的:
代码形式的队列中的Update函数应该如下所示:
public float speed = 100.0f;
void Update()
{
if (true)
{
foreach (GameObject move in spawning)
{
//Get Rigidbody component
Rigidbody rb = move.GetComponent<Rigidbody>();
//Calculate Z-axis pos to move to
Vector3 pos = new Vector3(0, 0, 1);
pos = pos.normalized * speed * Time.deltaTime;
//Move with Rigidbody
rb.MovePosition(rb.transform.position + pos);
}
}
}发布于 2018-04-15 18:51:25
您的问题是您有一个无法跳出的无限循环while true。相反,您应该添加一个计数器。你还没有解释你想要做什么,但我的例子是,一旦它完成了5个块的10个实例化,它就会突破。
IEnumerator SpawnBarrier(){
spawnCount=0
yield return new WaitForSeconds (3f);
while (true) {
for(int i=0;i<=4;i++)
{
spawning.Add (Instantiate (barrier, positions [i], Quaternion.identity)as GameObject);
}
if (++spawnCount==10)
{
break;
}
yield return new WaitForSeconds (3f);
}
}发布于 2018-04-15 21:10:16
如果我理解正确的话,你想摧毁与某种边界相撞的屏障?
如果边界是可见的屏幕空间
在这种情况下,我们可以假设,一旦对象对MainCamera不可见,就可以将其计为边界外。记住这一点,我们可以使用OnBecameInvisible()方法,它是由MonoBehaviour类调用的方法(或消息,如Unity Scripting API中所述):
// A piece of barrier that gets destroyed once out of screen
public sealed class BarrierPiece : MonoBehaviour
{
// Called once the object is no longer visible to any (scene editor included) camera
private void OnBecameInvisible()
{
Destroy(gameObject);
}
}注释:如果场景中有多个Camera,则对象必须对所有摄影机不可见,才能调用OnBecameInvisible()。
如果“边界”是其他对象
在这种情况下,有许多基于您的游戏的方法:
Rigidbody组件创建GameObject,并添加一个脚本,其中包含OnTriggerEnter(...)方法和销毁it.Vector2变量,一个用于pivotPosition,另一个用于maximumOffset (为了加快计算速度,应对此变量进行平方处理)。然后,在每个障碍物上编写脚本,并在Update()中检查对象到pivotPosition的平方距离是否大于maximumOffset,如果条件为true.Destroy(gameObject) ...这是我脑海中迅速浮现的两个问题。
希望这能有所帮助!
编辑
没有看过这些图片。
因此,对于您的解决方案,您需要将Rigidbody组件分配给Boundary,并在所有屏障上添加BoxCollider组件。现在,创建一个名为Barrier的标记,并用它标记所有屏障。创建脚本:
// Destroys barriers on collision
public sealed class BarrierBoundary : MonoBehaviour
{
// Called once the script is created
// Checks if the object has Rigidbody component attached
private void Awake()
{
Debug.Assert(GetComponent<Rigidbody>() != null);
}
private void OnCollisionEnter(Collision collision)
{
if(collision.collider.tag == "Barrier")
Destroy(collision.collider.gameObject);
}
}(代码没有经过测试,所以可能会有一些拼写错误。)
现在,将脚本分配给Boundary。瞧!屏障一旦命中边界就会被摧毁。
希望(再次)这能有所帮助!
https://stackoverflow.com/questions/49840340
复制相似问题