尝试制作一个按钮,因此如果玩家踩到它或在其上放置一个立方体,它会按下并打开一扇门

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 和后退按钮

是否可以制作一个按钮作为文件上传按钮?

具有多个标签的 iOS UIButton

如何在 WPF 中制作侧边栏

如何在 MapView 上绘制多边形,填充它,并在其上放置一个 onTouch 事件

R中绘制城市地图并在其上放置点的最佳软件包是啥?