需求:在项目开发过程中需要实现鼠标悬停游戏对象的时候,游戏对象高亮产生描边。
解决:使用unity官方商店中的Quick Outline插件
步骤一、下载unity插件
地址:Quick Outline | Particles/Effects | Unity Asset Store
该插件的完全免费的,直接加入自己的资源即可
步骤二、安装插件
在unity中找到窗口--包管理器--我的资产,然后就可以下载并导入插件
步骤三、插件使用
1. 添加脚本
只需要给你需要鼠标悬停高亮的物体添加Outline脚本
2.脚本配置项
插件的配置项主要就三个,Outline Mode、Outline Color、Outline Width。
Outline Mode模式共有五种,分别是
Silhouette Only:模型被遮挡的部分整体高亮;
Outline Hidden:模型被遮挡的部分轮廓高亮;
Outline All:整个模型的轮廓高亮;
Outline And Silhouette:整个模型轮廓高亮+被遮挡的部分整体高亮;
Outline Visible:模型未被遮挡的部分轮廓高亮;
3.脚本控制
该脚本实现高亮的原理是,初始化时禁用Outline脚本,然后创建从摄像机向鼠标的射线,如果射线碰撞到游戏对象,检查游戏对象是否有Outline脚本,如果有该脚本就激活该脚本。
注:还需要给游戏对象添加碰撞体,否则射线无法与游戏对象发生碰撞!!!
using UnityEngine;
// 鼠标悬停高亮
public class HoverHightlight : MonoBehaviour
{
private Outline outline;
void Start()
{
outline = GetComponent<Outline>();
if (outline != null)
{
outline.enabled = false;
}
}
void Update()
{
DetectMouseHover();
}
private void DetectMouseHover()
{
// 获取鼠标位置并发射射线
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
// 检测射线是否与任何物体相交
if (Physics.Raycast(ray, out hit))
{
// 检查射线检测到的物体是否为当前游戏对象
if (hit.transform == transform)
{
if (outline != null)
{
outline.enabled = true;
}
}else
{
if (outline != null)
{
outline.enabled = false;
}
}
}
else
{
if (outline != null)
{
outline.enabled = false;
}
}
}
}
Outline脚本挂载后运行脚本就可以实现高亮,所以我的思路是通过激活/禁用脚本实现的,大家也可以自己写思路控制即可。
补充:HighlightingSystem插件也可以实现类似效果,不过没有测试过。