尝试制作一个按钮,因此如果玩家踩到它或在其上放置一个立方体,它会按下并打开一扇门
Posted
技术标签:
【中文标题】尝试制作一个按钮,因此如果玩家踩到它或在其上放置一个立方体,它会按下并打开一扇门【英文标题】:trying to make a button so if the player steps on it or places a cube on it, it presses down and opens a door 【发布时间】:2022-01-23 21:25:32 【问题描述】:尝试制作一个按钮,这样如果玩家踩到它或在上面放置一个立方体,它就会按下并打开一扇门。我无法克服它只是下降的部分。每次我踩到它,它都会传送到远处。我也找不到任何关于如何用按钮打开门的事件系统。
using UnityEngine;
using UnityEngine.EventSystems;
using System.Collections;
public class DoorOpener : MonoBehaviour
bool pres = false;
public GameObject cube;
public GameObject player;
private float x = 49.849998474121097f;
private float y = 0.03762388229370117f;
private float z = 121.22000122070313f;
private float ny = -0.0123761177f;
void OnCollisionEnter(Collision collision)
bool press = true;
if (collision.gameObject == player)
transform.position = new Vector3(x, ny, z);
if (collision.gameObject == cube)
transform.position = new Vector3(x, ny, z);
private void Update()
if (pres)
transform.position = new Vector3(x, ny, z);
【问题讨论】:
您是否为这两个对象添加了刚体和碰撞体? 【参考方案1】:哥们!我检查了你的代码。首先,我建议你应该将 OnCollisionEnter 改为 void。 OnCollisionEnter 仅在对象触摸门按钮时起作用。但是如果你写OnCollisionStay
,只要它保持联系就可以工作,而不是“按布尔”,你可以使用OnCollisionExit
。另外,你可以写if (collision.gameObject.CompareTag(player))
来代替GameObject。在这种方法中,您只需将标签“播放器”给您的播放器即可。这只是一个不那么重要的建议,但我相信它会更好。不管怎样,你说我的按钮是传送的。这是完全正常的,因为您的代码 (transform.position = new Vector3(x, ny, z);
) 不是动画。它用于传送对象。您可以在 Unity 中为按钮移动制作基本动画。然后在 Unity Animator 中使用 bool 参数控制动画平移。看看我的示例代码。根据此代码,当具有“块”标签的对象触摸按钮时,动画参数“isButtonPressed”将为true
。当此对象停止触摸我们的按钮时,参数会更改为false
,并播放按钮向上动画。
public class buttonscripts : MonoBehaviour
Animator _animator;
void Start()
_animator = GetComponent<Animator>();
void OnCollisionStay(Collision collision)
if(collision.gameObject.CompareTag("block"))
_animator.SetBool("isButtonPressed", true);
void OnCollisionExit(Collision collision)
if (collision.gameObject.CompareTag("block"))
_animator.SetBool("isButtonPressed", false);
You can see my animator in here
【讨论】:
【参考方案2】:首先,您要在OnCollisionEnter
方法中创建一个名为press
的新局部变量。所以你的Update
永远不会生效。
然后,不要使用硬编码的位置 - 这可能是您意想不到的传送的来源(请记住,检查器显示 local 位置,但您设置了 global ) - 我宁愿使用类似的东西,例如
// Configure via the Inspector
public Vector3 moveOffsetOnPressed = Vector3.down * 0.04f;
private Vector3 originalPosition;
private Vector3 pressedPosition;
void Start()
originalPosition = transform.position;
pressedPosition = originalPosition + moveOffsetOnPressed;
void OnCollisionEnter(Collision collision)
if (collision.gameObject == player || collision.gameObject == cube)
transform.position = pressedPosition;
void OnCollisionExit(Collision collision)
if (collision.gameObject == player || collision.gameObject == cube)
transform.position = originalPosition;
但请注意:现在可能仍然存在问题!如果通过向下移动按钮..好吧,它不再与播放器/立方体碰撞=>您再次向上移动它=>您可能会将播放器/立方体发射到外太空;)
你能做些什么呢?仅当按钮在没有碰撞的情况下保持太长时间(例如 0.5 秒)时才再次向上移动,例如
void OnCollisionEnter(Collision collision)
if (collision.gameObject == player || collision.gameObject == cube)
StopAllCoroutines ();
transform.position = pressedPosition;
void OnCollisionExit(Collision collision)
if (collision.gameObject == player || collision.gameObject == cube)
StopAllCoroutines ();
StartCorouine (ExitRoutine ());
private IEnumerator ExitRoutine ()
yield return new WaitForSeconds (0.5f);
yield return new WaitForFixedUpdate ();
transform.position = originalPosition;
【讨论】:
以上是关于尝试制作一个按钮,因此如果玩家踩到它或在其上放置一个立方体,它会按下并打开一扇门的主要内容,如果未能解决你的问题,请参考以下文章
如何以编程方式在其上添加 UINavigationBar 和后退按钮