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

本文讲述了作者在学习Unity过程中,如何使用C#脚本和触发器事件实现门的开关控制,并在门附近显示交互提示。作者分享了IsPlayerNearDoor方法和如何利用OnTriggerEnter/OnTriggerExit来管理游戏逻辑和UI反馈。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

效果图是这样的

远离门时:

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

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

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"标签  
            {
                return true; // 如果找到带有"PlayerTag"标签的碰撞体,则返回true  
            }
        }
        return false; // 如果没有找到,则返回false  
    }

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

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

OnTriggerEnter、OnTriggerStay、OnTriggerExit

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

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

    public bool isInfor = false;
    public GameObject InforTip;

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

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

然后就可以啦。

我的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);
    }
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

椰椰燕麦奶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值