【问题标题】:Unity 3D Door ScriptUnity 3D 门脚本
【发布时间】:2017-08-17 20:36:15
【问题描述】:

我已经为大型金库门编写了门脚本。 我的问题如下:如果我将脚本分配给多个门 在场景中,所有门同时打开和关闭 其中一个被触动了。

using UnityEngine;
using System.Collections;

public class BigDoorScript : MonoBehaviour
{

    private bool doorOpen = false;
    private Ray ray;
    private RaycastHit hit;
    private float distance = 5.0f;
    public GameObject door;

    private void Update()
    {
        if (Input.GetKeyDown("e"))
        {
            ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            if (Physics.Raycast(ray, out hit, distance))
            {
                if (!doorOpen)
                {
                    door.transform.Translate(new Vector3(0.0f, 0.0f, 4.0f));
                    doorOpen = true;
                }
                else
                {
                    door.transform.Translate(new Vector3(0.0f, 0.0f, -4.0f));
                    doorOpen = false;
                }
            }
        }
    }
}

【问题讨论】:

  • 如何设置door 变量?
  • 尝试将门设为私有而不是公开。这可以解决同时激活所有门的问题,因为如果它是私有的,则只有该类的成员才能访问它。再说一次,我还没有看到您其余代码的结构,但值得一试。

标签: c# unity3d


【解决方案1】:

您所有的门都打开了,因为您实际上并没有检查 Raycast 中的命中对象是否实际上是您的脚本所引用的门对象。 Imtiaj 简要介绍了这一点,但对游戏对象进行字符串比较是一个坏主意,并且不会将自己限制在一个对象上,因为许多游戏对象具有相同的名称。

因此,任何碰撞都会使用此脚本打开所有大门。

你想用

if (hit.collider.gameObject == door)

【讨论】:

  • 我补充说:if(hit.collider.gameObject.name == "door")
【解决方案2】:

您根本不必声明门游戏对象。您可以使用 hitinfo ("hit")。试试这个 -

using UnityEngine;
using System.Collections;

public class BigDoorScript : MonoBehaviour
{

    private bool doorOpen = false;
    private Ray ray;
    private RaycastHit hit;
    private float distance = 5.0f;

    private void Update()
    {
        if (Input.GetKeyDown("e"))
        {
            ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            if (Physics.Raycast(ray, out hit, distance))
            {
                if(hit.collider.gameObject.name == "door"){//Check that your ray is colliding with the door
                    if (!doorOpen)
                    {
                        hit.transform.Translate(new Vector3(0.0f, 0.0f, 4.0f));
                        doorOpen = true;
                    }
                    else
                    {
                        hit.transform.Translate(new Vector3(0.0f, 0.0f, -4.0f));
                        doorOpen = false;
                    }
                }
            }
        }
    }
}

但请确保您的门游戏对象的名称是“门”,不带引号。

【讨论】:

    【解决方案3】:

    我认为问题在于您的距离值非常大,当您按下该距离内的另一扇门时,也会受到该打击。尝试降低该值

    【讨论】:

      【解决方案4】:

      我认为你不需要声明一个门游戏对象。只需使用 monobehavior 上的 gameObject 属性来移动脚本附加到的门:

      using UnityEngine;
      using System.Collections;
      
      public class BigDoorScript : MonoBehaviour
      {
          private bool doorOpen = false;
          private Ray ray;
          private RaycastHit hit;
          private float distance = 5.0f;
      
          private void Update()
          {
              if (Input.GetKeyDown("e"))
              {
                  ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                  if (Physics.Raycast(ray, out hit, distance))
                  {
                      if (!doorOpen)
                      {
                          gameObject.transform.Translate(new Vector3(0.0f, 0.0f, 4.0f));
                          doorOpen = true;
                      }
                      else
                      {
                          gameObject.transform.Translate(new Vector3(0.0f, 0.0f, -4.0f));
                          doorOpen = false;
                      }
                  }
              }
          }
      }
      

      【讨论】:

        【解决方案5】:
        using System.Collections;
        using System.Collections.Generic;
        using UnityEngine;
        
        public class DoorOpen : MonoBehaviour {
        
            public bool openclosed;
            public float angle;
        
        
            public bool InDistance;
        
            private void Start()
            {
        
                openclosed = false;
            }
        
            private void OnTriggerEnter(Collider other)
            {
                InDistance = true;
            }
            private void OnTriggerExit(Collider other)
            {
                InDistance = false;
            }
        
            private void Update()
            {
                if (Input.GetKeyDown(KeyCode.E) && InDistance == true && openclosed == false)
                {
                    openclosed = true;
                    transform.Rotate(0, 0, angle);
                }
        
                else if (Input.GetKeyDown(KeyCode.E) && openclosed == true && InDistance == true)
                {
                    openclosed = false;
                    transform.Rotate(0, 0, -angle);
                }
        
        
            }
        
        
        
        
        
        
        }
        

        这是一个简单的开门关门脚本,没有动画

        【讨论】:

        • 你能告诉我们更多关于代码的信息吗?未来的访问者可能根本不理解代码。同时删除最后一个enter code here
        猜你喜欢
        • 1970-01-01
        • 2015-01-11
        • 2020-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-11
        相关资源
        最近更新 更多