Unity3d 统一切换脚本

Unity3d 统一切换脚本,unity3d,Unity3d,我有这个工作脚本,我可以隐藏和显示游戏对象,但想修改它,只显示一个对象的时间 因此,当我开始播放时,会显示目标1,如果我激活m_键2,则会显示m_目标2,并隐藏其他目标,依此类推。 当时只有一个可见的m_目标 这样,我可以在屏幕中间显示的3个对象之间切换。 只需使用一个键在显示3个对象之间切换也会起作用,但编程似乎更难 可能吗 { [SerializeField] private KeyCode m_Key1 = KeyCode.G; [SerializeField] private KeyCo

我有这个工作脚本,我可以隐藏和显示游戏对象,但想修改它,只显示一个对象的时间

因此,当我开始播放时,会显示目标1,如果我激活m_键2,则会显示m_目标2,并隐藏其他目标,依此类推。 当时只有一个可见的m_目标

这样,我可以在屏幕中间显示的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…从不推荐使用公共字段。但它仍然会起作用,所以您可以选择