Unity学习记录:使用触发器制作人物靠近物体后交互的方法

使用Tigger触发器来制作靠近后出现交互图标的方法

本文基于Unity2019.3.2f1版本

最近想做一个第一人称的游戏出来,关于人物与物体的交互想做成很多游戏都采用的,人物靠近到一定的距离就会在物体上方出现一个提示图标,然后根据提示按下某键来与物体交互。所以有了这篇文章,记录一下自己的学习历程。

第一步:制作要交互的物体

因为算是一个功能,所以实体的物体就用普通的正方体来尝试。
首先创建一个Cube和一个有Box Collider的空物体Tigger,将空物体拖拽到Cube上,让空物体属于Cube的子物体。记得将空物体的is Tigger勾上。
cubeandTigger

第二步:制作提示图标

随便创建一个plane凑活一下,然后在文件栏中右键->Create->Material新建一个材质球,挂上自己选的图片,然后调整大小后挂在加了触发器的空物体上,这里我是自己P了个字母E上去,毕竟老滚之类的玩多了就习惯这样的方式。这里我为了以后使用方便就将它制作成预制件了。
图标

第三步:代码

关于触发器的代码很好写,有专门的方法。这里借用一下大佬们的代码。将其挂在Tigger那个空物体上面。

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

public class TiggerTest : MonoBehaviour
{
    public GameObject prompt;

    public void Show(GameObject prompt){
        //用来将某个物体激活或是禁用(这里是prompt,也就是那个图标
        //禁用时这个物体和其子物体都会禁用,包括上面的脚本,在这里很方便
        prompt.SetActive(true);
    }
    public void Hide(GameObject prompt){
        prompt.SetActive(false);
    }
    void OnTriggerEnter(Collider other)//接触时触发,无需调用
    {
        Debug.Log(Time.time + ":进入该触发器的对象是:" + other.gameObject.name);
        Show(prompt);
    }
    void OnTriggerStay(Collider other)    //每帧调用一次OnTriggerStay()函数
    {
        Debug.Log(Time.time + "留在触发器的对象是:" + other.gameObject.name);
    }
    void OnTriggerExit(Collider other)
    {
        Debug.Log(Time.time + "离开触发器的对象是:" + other.gameObject.name);
        Hide(prompt);
    }
    
    // Start is called before the first frame update
    void Start()
    {
        Hide(prompt);
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

可以看到,这个脚本实现了当有对象进入触发器时,图标会出现,离开后消失。
但是当调试时又出现了一个问题:图标毕竟只是一个plane,2d的纸片图标在人物进行3d移动时观感很不好。
都快看不见了
所以要在写一个让图标一直面对摄像机的脚本。

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

public class FaceToCamera : MonoBehaviour
{
    
    
    // Start is called before the first frame update
    void Start()
    {
    
    
        
    }

    // Update is called once per frame
    void Update()
    {
    
    
        //当前对象始终面向摄像机。
        this.transform.LookAt(Camera.main.transform.position);
        this.transform.Rotate(90,0,0);
    }
}

然后将该脚本挂在对象plane图标上面就行了。
最后,因为光照的原因,图标在旋转时会出现背光的时候,这时要将图标所用材质球的属性修改一下,将Shader选为Unlit/Texture就大功告成了。
Texture

成果

为了实验一下是否成功,我将Fungus插件做了一个简单对话挂了上去。
上传的大小限制也太大了,只让传5M不到

加强版

上面虽然解决了靠近物体后可以交互的问题,但是如果想要做出小物体交互,比如在桌子上面拿走或是检查一个钥匙杯子之类的小物体就很难实现了,所以要想一个新的方法触发Tigger。
方法其实很简单,只需要将一个去掉了Mash Renderer组件的Cube放在摄像机上就行了。
Touch
适当的调整位置
在这里插入图片描述然后就大功告成了!
此时随着镜头的移动,这个Cube也会随之移动,然后当触碰到触发器后就会触发脚本实现与物体交互的功能。

猜你喜欢

转载自blog.csdn.net/weixin_46149121/article/details/106061176
今日推荐