Unity 3D门脚本
Unity 3D Door Script
我已经为大金库门写了一个门脚本。
我的问题如下:如果我将脚本分配给多个门
在场景中,所有的门同时打开和关闭
其中一个被感动了。
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;
}
}
}
}
}
我认为问题是您的距离值非常大,当您按下一扇门时,该距离内的另一扇门也会被击中。尝试降低该值
您根本不必声明门游戏对象。您可以使用 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;
}
}
}
}
}
}
但请确保门游戏对象的名称是 "door",不带引号。
我认为您不需要声明门游戏对象。只需在 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;
}
}
}
}
}
你所有的门都打开了,因为你实际上并没有检查 Raycast 中的命中对象是否实际上是你的脚本所引用的门对象。 Imtiaj 简要地谈到了这一点,但游戏对象上的字符串比较是一个坏主意,并且不会将自己限制在一个对象上,因为许多游戏对象具有相同的名称。
因此,任何碰撞都会使用此脚本打开所有门。
您想使用
if (hit.collider.gameObject == door)
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);
}
}
}
这是一个简单的开门关门脚本,没有动画
我已经为大金库门写了一个门脚本。 我的问题如下:如果我将脚本分配给多个门 在场景中,所有的门同时打开和关闭 其中一个被感动了。
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;
}
}
}
}
}
我认为问题是您的距离值非常大,当您按下一扇门时,该距离内的另一扇门也会被击中。尝试降低该值
您根本不必声明门游戏对象。您可以使用 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;
}
}
}
}
}
}
但请确保门游戏对象的名称是 "door",不带引号。
我认为您不需要声明门游戏对象。只需在 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;
}
}
}
}
}
你所有的门都打开了,因为你实际上并没有检查 Raycast 中的命中对象是否实际上是你的脚本所引用的门对象。 Imtiaj 简要地谈到了这一点,但游戏对象上的字符串比较是一个坏主意,并且不会将自己限制在一个对象上,因为许多游戏对象具有相同的名称。
因此,任何碰撞都会使用此脚本打开所有门。
您想使用
if (hit.collider.gameObject == door)
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);
}
}
}
这是一个简单的开门关门脚本,没有动画