【发布时间】:2021-08-23 16:48:08
【问题描述】:
我想绑定向上和向下箭头键,以便在按下时循环显示不同的精灵。如果到达一端,它将循环回到第一个精灵。我试过使用以下代码:
public class PhaseChanger : MonoBehaviour
{
// saved for efficiency
[SerializeField]
public GameObject prefabMoon0;
[SerializeField]
public GameObject prefabMoon1;
[SerializeField]
public GameObject prefabMoon2;
[SerializeField]
public GameObject prefabMoon3;
[SerializeField]
public GameObject prefabMoon4;
// needed for new phase
GameObject currentPhase;
bool previousFramePhaseChangeInput = false;
/// <summary>
/// Start is called before the first frame update
/// </summary>
void Start()
{
currentPhase = Instantiate<GameObject>(prefabMoon0);
}
/// <summary>
/// Update is called once per frame
/// </summary>
void Update()
{
// change phase on up arrow or down arrow
if (Input.GetAxis("ChangePhase") > 0)
{
// only change phase on first input frame
if (!previousFramePhaseChangeInput)
{
previousFramePhaseChangeInput = true;
// Save current position and destroy current phase
Destroy(currentPhase);
// instantiate next phase
if (currentPhase = prefabMoon0)
{
currentPhase = Instantiate(prefabMoon1);
}
else if (currentPhase = prefabMoon1)
{
currentPhase = Instantiate(prefabMoon2);
}
else if (currentPhase = prefabMoon2)
{
currentPhase = Instantiate(prefabMoon3);
}
else if (currentPhase = prefabMoon3)
{
currentPhase = Instantiate(prefabMoon4);
else
{
// no phase change input
previousFramePhaseChangeInput = false;
}
}
}
}
当我将脚本附加到我的主摄像头并运行它时,我可以使用向上箭头进行一次更改,然后在后续按下时不会发生任何其他事情。
我觉得我真的很接近完成这项工作,但我也可能在做整个事情时效率低下。非常感谢您的帮助,谢谢!
另外:我知道我在帖子中提到了精灵,并且正在分享一个调用预制件的脚本。我不知道如何只使用精灵而不为每个精灵制作预制件来解决这个问题。是否可以在没有为每个精灵单独的预制件的情况下做到这一点?
【问题讨论】:
-
似乎您在 if 语句中分配而不是比较引用。你试过纠正它吗?此外,你有没有试过Array?
-
我以前使用过 foreach 数组,但我不确定这是否是我需要的。您能否进一步解释一下这是如何应用的?我也不确定你所说的“纠正它”是什么意思。谢谢。
-
if-statements有if (currentPhase = prefabMoon0),而它应该是if (currentPhase == prefabMoon0)和==,而不是=。除了使用if-elseif,您可以简单地遍历每个索引并在需要时增加其值,例如++index; index %= prefabArray.Length,并使用此index值来分配新的预制件或使用object pooling。 -
感谢您的回答。我正在阅读对象池。我很抱歉,但我对脚本和 Unity 很陌生;你能引导我完成你上面建议的解决方案吗?我将不胜感激。
-
@nIcEcOw 这是一个问题,但还不够(见my answer);)