本文基于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也会随之移动,然后当触碰到触发器后就会触发脚本实现与物体交互的功能。

前的游戏项目,需要找到正确的榫卯部件,移动到靠近正确拼接的部件时,触发模型的拼接动画,榫卯物品开始拼接,动画开始4s后触发“变身”特效,模型替换,拼接完成后会有指示的游戏UI提示出现。演示过程如下图所示: 实现代码如下: using System.Collections; using System.Collections.Generic; using UnityEngine; public class Pig2 : MonoBehaviour public GameObject cube1;
Unity 工具类 之 AR/VR Gaze 凝视/按键/鼠标 点击 UI/游戏物体交互方式实现 1、参照 Unity 交互方法,写一个凝视/按键/鼠标交互方式的类 2、继承 Unity的 PointerInputModule 类,重写和添加方法控制凝视/按键/鼠标交互方式的类的选择、未选择、选中的交互动态 3、添加一个类了动态调整凝视点圈的位置 4、Unity 一个简单的控制陀螺仪实现在场景中间旋转的类,控制相加旋转,进行场景的凝视交互 5、shader 控制凝视动态的进度,也可以使用 UGUI 360 UI,方法大同小异,控制 Value 而已 6、按键交互,在Android 层添加 按键的监听事件,监听按钮的操作
将之前制作好的角色模型变成预制体,并命名为Player。 并将player的Tag设置为player.添加Rigidbody,Character Controller,Capsule Collider组件 将Rigidbody组件设置为运动学 这个角色是由RobotPlayer所控制。并且RobotPlayer是继承自BaseRobot。 其中BaseRobot代码如下: using System.Collections; using System.Collections.Generic; using