我之前已经问过这个问题了,我以为我得到了答案,但它并没有为我工作。所以,又来了。
Unity 不在场景之间保持关键状态。例如,让我们说我按住空格并跟踪单词" Hello"使用:
Input.GetKey(KeyCode.Space)){
print("Hello!");
}
现在。让我们说我使用以下方法重置场景:
Application.LoadLevel(0);
或
SceneManager.LoadScene(0);
无论哪一个适合你。如果我重置了场景,但我仍然保持空间,在我抬起手指并再次放下它之前没有任何反应。当我构建我的2D Top Down游戏时,这是一个巨大的问题,因为我正在计划建筑物和内部物品是不同的场景。有没有人有任何想法?请不要建议
DontDestroyOnLoad
因为那不起作用。我试过了,你可以亲自尝试一下。我还缺少任何其他想法或技巧或其他东西?我在这里绝望。感谢。
我正在使用C#和Unity。
答案 0 :(得分:1)
Unity不会在场景之间保留关键字
部分不正确。当加载新场景时,Unity的Input.GetKey(KeyCode.Space)
将在第一帧中返回false
。这仅发生在第一帧中。之后,如果空格键仍然按下,它将继续返回true
。此声明基于Unity 5.4.0b13 。如果您看到不同的结果,则必须更新。
解决方法是将Input.GetKey(KeyCode.Space)
放在coroutine
中,然后在检查按键之前等待yield return null;
一帧。
void Start()
{
StartCoroutine(readKey());
}
bool keepReading = false;
IEnumerator readKey()
{
if (keepReading)
{
yield break;
}
keepReading = true;
yield return null;
while (keepReading)
{
if (Input.GetKey(KeyCode.Space))
{
Debug.Log("Hello!");
}
else
{
Debug.Log("Not down!");
}
yield return null;
}
}
void stopReading()
{
keepReading = false;
}
另一个选择是使用布尔变量来确定下一帧中的时间。
bool afterFirstFrame = false;
void Update()
{
if (afterFirstFrame)
{
//Put your code here
if (Input.GetKey(KeyCode.Space))
{
Debug.Log("Hello!");
}
else
{
Debug.Log("Not down!");
}
}
if (!afterFirstFrame)
{
afterFirstFrame = true;
}
}
答案 1 :(得分:0)
以下可能不是最干净的方法,但它适用于一些粗略的测试。
通过使用PlayerPrefs,您可以存储状态的表示并在新加载的场景的Start()函数中测试它。
它将创建的功能是,如果用户在切换场景之前保持它,它将验证第一帧是否为真。仅当用户允许释放按钮时,它才会停止验证true。
再一次,这是一种强制操作的实现,但需要进行自定义以确保其在其他情况下的行为正确。
private bool isPressed = false;
void Start()
{
if (PlayerPrefs.GetInt("Pressed") != 0)
isPressed = true;
else
isPressed = false;
}
void Update()
{
if (isPressed)
print("Hello World");
if (Input.GetKey(KeyCode.Space))
{
if (!isPressed) isPressed = true;
}
if (Input.GetKeyUp(KeyCode.Space))
{
isPressed = false;
}
}
public void SaveButtonState()
{
if(isPressed)
PlayerPrefs.SetInt("Pressed", 1);
else
PlayerPrefs.SetInt("Pressed", 0);
}
答案 2 :(得分:0)
您是否尝试在主要级别以下的某处添加内部级别。不仅仅是在玩家离开建筑物之后将玩家移动到这一点,你可以卸载场景并将玩家移回原处。