当前位置:   article > 正文

【unity】玩家接近物体时显示交互提示(傻瓜版)_unity靠近物体弹窗交互

unity靠近物体弹窗交互

学习unity第四天,学艺不精的情况下上手了,不知道怎么构建框架,不会用事件把game和ui分开,全写在一个文件里了。

效果图是这样的

远离门时:

靠近门后(显示一个交互提示,离开时会消失):

我先是写好了开关门的脚本DoorsController(详见上一篇),然后其中有一个判断玩家接近的方法

  1. private bool IsPlayerNearDoor()
  2.     {
  3.         // 假设玩家有一个名为PlayerTag的标签
  4.         Collider[] colliders = Physics.OverlapBox(doorCollider.bounds.center, doorCollider.bounds.size * 0.5f); // 使用门的中心和大小来检测碰撞体  
  5.         foreach (Collider col in colliders)
  6.         {
  7.             if (col.CompareTag("Player")) // 检查碰撞体是否有"Player"标签  
  8.             {
  9.                 return true; // 如果找到带有"PlayerTag"标签的碰撞体,则返回true  
  10.             }
  11.         }
  12.         return false; // 如果没有找到,则返回false  
  13.     }

接下来我就是用这个方法实现这一功能的。

首先是触发器组件有三个自带的API

OnTriggerEnter、OnTriggerStay、OnTriggerExit

第一个进入区域执行一次,第二个是在区域内一直执行,第三个是离开时执行一次。

所以显而易见,我们需要用到OnTriggerEnter和OnTriggerExit

  1. public bool isInfor = false;
  2. public GameObject InforTip;
  3. private void OnTriggerEnter(Collider other)
  4. {
  5. InforTip.SetActive(isInfor = !isInfor);
  6. }
  7. private void OnTriggerExit(Collider other)
  8. {
  9. InforTip.SetActive(isInfor = !isInfor);
  10. }

然后出去以后把组件绑定一下~

然后就可以啦。

我的DoorsController如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;

public class DoorsController : MonoBehaviour
{
    private Animator anim; // 动画控制器组件  
    private bool isOpen = false; // 记录门是否打开  
    private Collider doorCollider; // 门的碰撞体组件  


    public bool isInfor = false;
    public GameObject InforTip;

    // Start is called before the first frame update  
    void Start()
    {
        anim = GetComponent<Animator>(); // 获取动画控制器组件  
        doorCollider = GetComponent<Collider>(); // 获取门的碰撞体组件  
        // 初始设置门不是触发器  
        doorCollider.isTrigger = false;
    }

    // Update is called once per frame  
    void Update()
    {
        // 如果门是打开的且玩家按下了E键,则关闭门  
        if (isOpen && Input.GetKeyDown(KeyCode.E))
        {
            CloseDoor();
        }
        // 如果门是关闭的且玩家按下了E键,并且玩家与门发生了碰撞,则打开门  
        else if (!isOpen && Input.GetKeyDown(KeyCode.E) && IsPlayerNearDoor())
        {
            OpenDoor();
        }
    }

    private void OpenDoor()
    {
        // 触发开门动画  
        anim.SetTrigger("Open");
        // 将门设置为触发器,允许玩家穿过
        doorCollider.isTrigger = true;
        isOpen = true; // 标记门为打开状态  
    }

    private void CloseDoor()
    {
        // 触发关门动画  
        anim.SetTrigger("Close");
        // 如果之前将门设置为触发器,现在关闭时应该将其改回非触发器状态  
        doorCollider.isTrigger = false;
        isOpen = false; // 标记门为关闭状态  
    }

    // 检查玩家是否接近门(通过碰撞器检测)  
    private bool IsPlayerNearDoor()
    {
        // 假设玩家有一个名为PlayerTag的标签
        Collider[] colliders = Physics.OverlapBox(doorCollider.bounds.center, doorCollider.bounds.size * 0.5f); // 使用门的中心和大小来检测碰撞体  
        foreach (Collider col in colliders)
        {
            if (col.CompareTag("Player")) // 检查碰撞体是否有"Player"标签  
            {
                //InforTip.SetActive(isInfor = !isInfor);//对附近的门显示交互提示
                return true; // 如果找到带有"PlayerTag"标签的碰撞体,则返回true  
            }
        }
        return false; // 如果没有找到,则返回false  
    }

    private void OnTriggerEnter(Collider other)
    {
        InforTip.SetActive(isInfor = !isInfor);
    }
    private void OnTriggerExit(Collider other)
    {
        InforTip.SetActive(isInfor = !isInfor);
    }
}

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/599782
推荐阅读
相关标签
  

闽ICP备14008679号