試圖制作一個按鈕,以便如果玩家踩到它或在上面放置一個立方體,它會按下并打開一扇門。我無法克服它只是下降的部分。每次我踩到它時,它都會傳送到遠處。我也找不到任何關于如何用按鈕打開門的事件系統。
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);
}
}
}
uj5u.com熱心網友回復:
伙伴!我檢查了你的代碼。首先,我建議你應該將 OnCollisionEnter 改為 void。OnCollisionEnter 僅在物件接觸門按鈕時起作用。但是如果你寫OnCollisionStay,只要它保持聯系,它就會作業,而不是“按布林值”,你可以使用OnCollisionExit. 此外,您可以撰寫if (collision.gameObject.CompareTag(player))而不是使用 GameObject。在這種方法中,您可以將標簽“玩家”賦予您的播放器。這只是一個不太重要的建議,但我相信它會更好。不管怎樣,你說我的按鈕正在傳送。這是完全正常的,因為您的代碼 (transform.position = new Vector3(x, ny, z);) 不是影片。它用于傳送物件。您可以在 Unity 中為按鈕移動制作基本影片。然后在 Unity Animator 中使用 bool 引數控制影片翻譯。看看我的示例代碼。根據此代碼,當具有“block”標簽的物件觸摸按鈕時,影片引數“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);
}
}
}
你可以在這里看到我的影片師
uj5u.com熱心網友回復:
首先,您要創建一個press在OnCollisionEnter方法中呼叫的新區域變數。所以你Update永遠不會生效。
然后,而不是使用硬編碼位置 - 這可能是您意外傳送的來源(請記住,檢查員顯示本地位置,但您設定了全域位置) - 我寧愿使用類似的東西,例如
// 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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/393338.html
上一篇:如何在接觸墻壁后阻止玩家旋轉?
