我使用SetActive禁用了一个块。然后我使用ActiveSelf检查对象是否处于活动状态。但是根据我的想法,一段时间后块不会出现。
编码:
using UnityEngine;
using System.Collections;
public class IceBlockDestroy : MonoBehaviour {
bool onBlock;
Animator anim;
public float waitAfterStepped;
public float waitAfterDestroy;
public IceBlockDestroy block;
// Use this for initialization
void Start () {
block = gameObject.GetComponent<IceBlockDestroy>();
anim = gameObject.GetComponent<Animator> ();
}
// Update is called once per frame
void Update () {
if(!block.gameObject.activeSelf){
waitAfterDestroy-=Time.deltaTime;
if(waitAfterDestroy < 0){
block.gameObject.SetActive(true);
anim.SetBool ("isStepped", false);
}
}
}
void OnCollisionStay2D(Collision2D other)
{
if (onBlock) {
anim.SetBool ("isStepped", true);
waitAfterStepped-=Time.deltaTime;
if(waitAfterStepped < 0){
block.gameObject.SetActive(false);
}
}
}
void OnTriggerEnter2D()
{
onBlock = true;
}
void OnTriggerExit2D(){
onBlock = false;
}
}
问题:如何归还区块?SetActive 和 ActiveSelf 在这里合适吗?


如果我没理解错的话,那么你做了一件有趣的事:你在每个块上放了一个脚本。
block同时,您在变量中放置了对同一块组件的引用。结果在该行中:您使执行脚本的块处于非活动状态。合乎逻辑的是,当它变得不活动时,它就会关闭。结果,该方法
Update和其他方法不再起作用(为什么引擎要空转它们?)。现在,如果您在变量中有一个对象的引用(将通过编辑器将其放入),那么
block您将从另一个对象开始block.gameObject工作。因此:他为自己挖了一个洞。一般来说,至少有两种解决方案:
您创建了某种用于处理块的总经理,其中将有一个数组/列表,通常是这些块的集合。这个管理器只是控制这些方块,包括它们的出现和消失(例如,当一个方块被跳到它上面时它会发送一条消息“跳到我身上!”,然后管理器收到消息并做出反应)。
您可以更改两个参数,而不是执行
SetActive:BoxCollider2D(或者你挂在那里的任何对撞机)在这种情况下,脚本将继续正常工作,但对象将按预期出现和消失。
还要提醒你,变量
waitAfterStepped和waitAfterDestroy你运算后不返回原值 。结果,在第一次消失/出现后,它们将保持负值。我还建议有时(总是)在 VisualStudio或MonoDevelop IDE中开发,其中有时(总是)在难以理解的情况下,调试:将
breakpoint它放在看起来应该出现预期逻辑的地方,看看会发生什么,获得什么数据在变量中,而不是这种方式。