Unity3d 统一切换脚本
我有这个工作脚本,我可以隐藏和显示游戏对象,但想修改它,只显示一个对象的时间 因此,当我开始播放时,会显示目标1,如果我激活m_键2,则会显示m_目标2,并隐藏其他目标,依此类推。 当时只有一个可见的m_目标Unity3d 统一切换脚本,unity3d,Unity3d,我有这个工作脚本,我可以隐藏和显示游戏对象,但想修改它,只显示一个对象的时间 因此,当我开始播放时,会显示目标1,如果我激活m_键2,则会显示m_目标2,并隐藏其他目标,依此类推。 当时只有一个可见的m_目标 这样,我可以在屏幕中间显示的3个对象之间切换。 只需使用一个键在显示3个对象之间切换也会起作用,但编程似乎更难 可能吗 { [SerializeField] private KeyCode m_Key1 = KeyCode.G; [SerializeField] private KeyCo
这样,我可以在屏幕中间显示的3个对象之间切换。
只需使用一个键在显示3个对象之间切换也会起作用,但编程似乎更难 可能吗{
[SerializeField] private KeyCode m_Key1 = KeyCode.G;
[SerializeField] private KeyCode m_Key2 = KeyCode.G;
[SerializeField] private KeyCode m_Key3 = KeyCode.G;
[SerializeField] private GameObject m_Target1;
[SerializeField] private GameObject m_Target2;
[SerializeField] private GameObject m_Target3;
void Start()
{
}
void Update()
{
if (m_Target1 != null && Input.GetKeyDown(m_Key1))
m_Target1.SetActive(!m_Target1.activeSelf);
if(m_Target2 != null && Input.GetKeyDown(m_Key2))
m_Target2.SetActive(!m_Target2.activeSelf);
if(m_Target3 != null && Input.GetKeyDown(m_Key3))
m_Target3.SetActive(!m_Target3.activeSelf);
}
当然,你可以做到。有几种方法:
void Update(){
if (m_Target1 != null && Input.GetKeyDown(m_Key1))
{
m_Target1.SetActive(true);
m_Target2.SetActive(false);
m_Target3.SetActive(false);
// not reversing because we from what I understand you don't want to
// toggle you just want to activate so always true
// setting others to false so that when you press one the others turn off
}
else if(m_Target2 != null && Input.GetKeyDown(m_Key2))
{
m_Target1.SetActive(false);
m_Target2.SetActive(true);
m_Target3.SetActive(false);
}
else if(m_Target3 != null && Input.GetKeyDown(m_Key3))
{
m_Target1.SetActive(false);
m_Target2.SetActive(false);
m_Target3.SetActive(true);
}}
public class Display : MonoBehaviour {
[SerializedField]
private KeyCode left;
[SerializedField]
private KeyCode right;
[SerializedField]
private GameObject[] targets;
private int index = 0;
private int prevIndex = 0;
public void Start() {
for (int i = 0; i < targets.Length; i++)
targets[i].SetActive(i == 0);
// turning off all targets and turning on first
}
public void Update() {
if (Input.GetKeyDown(left)) {
prevIndex = index;
index += index + 1 < targets.Length ? 1 : -(targets.Length - 1);
targets[index].SetActive(true);
targets[prevIndex].SetActive(false);
}
else if (Input.GetKeyDown(right)) {
prevIndex = index;
index -= index -1 < 0 ? -(targets.Length - 1) : 1;
targets[index].SetActive(true);
targets[prevIndex].SetActive(false);
}
// if left or right buttons are pressed
// changing the index, turning off previous and turning on current
}
公共类显示:单行为{
[数据字段]
私钥密码左;
[数据字段]
私钥密码权;
[数据字段]
私有游戏对象[]目标;
私有整数指数=0;
私有索引=0;
公开作废开始(){
for(int i=0;i
你在这里看到的很简单,定义一个对象列表,任何数字都可以,所以无论你想显示3个对象还是20个对象都无关紧要。定义左键和右键
当您按下左键时,它将转到下一个对象,或者如果最后一个对象返回到第一个对象。
按右键将转到上一个或最后一个(如果在第一个)
for循环将关闭除选定对象之外的所有对象
(我没有测试它,我只是快速编写了它,因此如果有任何问题,请让我知道)循环效率非常低,因为它执行的是
targets.Length-2
不必要的操作。您应该通过简单地更新新旧索引处的对象来优化它。您是对的,当您只能更新2时,没有理由全部更新它们。但是我工作很快,OP没有要求优化。但是,我将更新一个解决方案。谢谢你哇哦,我写了SerializedField而不是SerializedField…我告诉过你我没有测试它,所以只是一个轻微的拼写错误,我复制了pastedIts都很好,我找到了它,删除了SerializedField并将其私有化为公共。效果很好,很好。我的感谢:)建议将SerializedField更改为SerializeField,这会起作用,并将其改回private…从不推荐使用公共字段。但它仍然会起作用,所以您可以选择