我已经有2天试图解决这个问题,但我不能。我试图在它们与边界碰撞时一致地删除无限的产卵障碍。障碍是由5个立方体制成的。任何想法?
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 0 :(得分:1)
您的障碍物在其对手上被标记为isTrigger
因此您可以使用OnTriggerEnter
来检测任何障碍何时与边界发生碰撞。
您需要创建新脚本,让我们调用BoundaryDetector
并将其附加到屏障预制件上,以便屏障的每个实例都附加此脚本。
调用OnTriggerEnter
时,检查边界是否触发。这可以通过检查“播放器”标签来完成,因为边界在屏幕截图中被标记为播放器。如果检测到的触发器标签是“播放器”,则首先从产卵列表中移除产卵,然后移除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 。您必须将Rigidbody
附加到至少一个对象(边界或障碍物)。在这种情况下,我建议您对屏障预制件这样做。
2 。您必须删除move.transform.Translate (0f, 0f, -0.1f);
并将其替换为Rigidbody.MovePosition
并使用它来移动您的barries,因为您现在已将Rigidbody
附加到您的barries上这是移动Rigidbody
对象的正确方法。
也许是这样的:
代码表单中的更新功能你的问题看起来应该是这样的:
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);
}
}
}
答案 1 :(得分:0)
你的问题是,你有一个无限循环while true
,你没有突破。相反,你应该添加一个计数器。你还没有解释你想要做什么,但我的例子是它一旦完成10个实例化的5个实例就会突破。
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);
}
}
答案 2 :(得分:0)
如果我理解的话,你想破坏与某种边界相撞的障碍吗?
在这种情况下,我们可以假设,一旦对象对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()
。
在这种情况下,基于您的游戏有很多方法:
GameObject
组件创建Rigidbody
并添加一个脚本,该脚本具有OnTriggerEnter(...)
方法并消除其中的碰撞障碍。Vector2
变量,一个用于pivotPosition
,另一个用于maximumOffset
(为了更快的计算,这个应该是平方的)。然后,在每个障碍上设置脚本并在Update()
中检查对象与pivotPosition
的平方距离是否大于maximumOffset
并调用Destroy(gameObject)
条件是true
。在我的脑海中迅速出现了两个。
希望这有帮助!
没看过图片......
因此,对于您的解决方案,您需要将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
。瞧!一旦撞到边界,障碍就会被摧毁
希望(再次)这有帮助!