Unity3D实现描边框效果

 更新时间:2020年04月15日 10:04:29   作者:即步  
这篇文章主要为大家详细介绍了Unity3D实现描边框效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

Unity3d描边框效果网上有很多,大多是使用Shader来实现的

本文介绍使用Collider来实现这么一种效果

效果图如下

将物体添加Collider(Box Collider、Mesh Collider......)

每个Collider都有自己的边界Bound,描边效果就是将Bound显示出来

代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
 
public class ShowBoxCollider : MonoBehaviour
{
 void OnRenderObject()
 {
  var colliders = gameObject.GetComponents<Collider>();
  if (colliders == null)
  {
   return;
  }
  //创建并设置线条材质
  CreateLineMaterial();
  lineMaterial.SetPass(0);
  GL.PushMatrix();
  //这里无需将矩阵从本地坐标转化为世界左边
  //GL.MultMatrix(transform.localToWorldMatrix);
 
  for (int i = 0; i < colliders.Length; i++)
  {
   var col = colliders[i];
   //获取本物体对象在世界范围内的中心点位置 col.center是本地坐标位置
   var c = col.bounds.center;
   //collider大小
   var size = col.bounds.size;
   float rx = size.x / 2f;
   float ry = size.y / 2f;
   float rz = size.z / 2f;
   //获取collider边界的8个顶点位置
   Vector3 p0, p1, p2, p3;
   Vector3 p4, p5, p6, p7;
   p0 = c + new Vector3(-rx, -ry, rz);
   p1 = c + new Vector3(rx, -ry, rz);
   p2 = c + new Vector3(rx, -ry, -rz);
   p3 = c + new Vector3(-rx, -ry, -rz);
 
   p4 = c + new Vector3(-rx, ry, rz);
   p5 = c + new Vector3(rx, ry, rz);
   p6 = c + new Vector3(rx, ry, -rz);
   p7 = c + new Vector3(-rx, ry, -rz);
 
   //画线
   GL.Begin(GL.LINES);
   GL.Color(Color.cyan);
   GL.Vertex(p0);
   GL.Vertex(p1);
   GL.End();
 
   GL.Begin(GL.LINES);
   GL.Color(Color.cyan);
   GL.Vertex(p1);
   GL.Vertex(p2);
   GL.End();
 
   GL.Begin(GL.LINES);
   GL.Color(Color.cyan);
   GL.Vertex(p2);
   GL.Vertex(p3);
   GL.End();
 
   GL.Begin(GL.LINES);
   GL.Color(Color.cyan);
   GL.Vertex(p0);
   GL.Vertex(p3);
   GL.End();
 
   GL.Begin(GL.LINES);
   GL.Color(Color.cyan);
   GL.Vertex(p4);
   GL.Vertex(p5);
   GL.End();
 
   GL.Begin(GL.LINES);
   GL.Color(Color.cyan);
   GL.Vertex(p5);
   GL.Vertex(p6);
   GL.End();
 
   GL.Begin(GL.LINES);
   GL.Color(Color.cyan);
   GL.Vertex(p6);
   GL.Vertex(p7);
   GL.End();
 
   GL.Begin(GL.LINES);
   GL.Color(Color.cyan);
   GL.Vertex(p4);
   GL.Vertex(p7);
   GL.End();
 
   GL.Begin(GL.LINES);
   GL.Color(Color.cyan);
   GL.Vertex(p0);
   GL.Vertex(p4);
   GL.End();
 
   GL.Begin(GL.LINES);
   GL.Color(Color.cyan);
   GL.Vertex(p1);
   GL.Vertex(p5);
   GL.End();
 
   GL.Begin(GL.LINES);
   GL.Color(Color.cyan);
   GL.Vertex(p2);
   GL.Vertex(p6);
   GL.End();
 
   GL.Begin(GL.LINES);
   GL.Color(Color.cyan);
   GL.Vertex(p3);
   GL.Vertex(p7);
   GL.End();
  }
  GL.PopMatrix();
 }
 
 static Material lineMaterial;
 static void CreateLineMaterial()
 {
  if (!lineMaterial)
  {
   // Unity3d使用该默认的Shader作为线条材质 
   Shader shader = Shader.Find("Hidden/Internal-Colored");
   lineMaterial = new Material(shader);
   lineMaterial.hideFlags = HideFlags.HideAndDontSave;
   // 开启 alpha blending 
   lineMaterial.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
   lineMaterial.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
   // 开启背面遮挡 
   lineMaterial.SetInt("_Cull", (int)UnityEngine.Rendering.CullMode.Off);
   // Turn off depth writes 
   lineMaterial.SetInt("_ZWrite", 0);
  }
 }
}

使用GL将Bound的8条边通过画线形式渲染出来!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • c#检测端口是否被占用的简单实例

    c#检测端口是否被占用的简单实例

    这篇文章主要介绍了c#检测端口是否被占用的简单实例,有需要的朋友可以参考一下
    2013-12-12
  • 使用设计模式中的工厂方法模式进行C#编程的示例讲解

    使用设计模式中的工厂方法模式进行C#编程的示例讲解

    这篇文章主要介绍了使用设计模式中的工厂方法模式进行C#编程的示例讲解,工厂方法模式可以看作是对简单工厂模式的进一步扩展,需要的朋友可以参考下
    2016-02-02
  • DevExpress之ChartControl实现时间轴实例

    DevExpress之ChartControl实现时间轴实例

    这篇文章主要介绍了DevExpress中ChartControl实现时间轴的方法,涉及相关C#绘图程序用法,具有一定的实用价值,需要的朋友可以参考下
    2014-10-10
  • C#波形图控件制作示例程序

    C#波形图控件制作示例程序

    这篇文章主要介绍了C#波形图控件的制作方法,大家参考使用
    2013-11-11
  • C#实现AI五子棋游戏的示例代码

    C#实现AI五子棋游戏的示例代码

    这篇文章主要为大家详细介绍了C#如何智能AI五子棋游戏中的人工下棋操作以及对应的机器操作,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-11-11
  • c# 从IE浏览器获取当前页面的内容

    c# 从IE浏览器获取当前页面的内容

    从IE浏览器获取当前页面内容可能有多种方式,今天我所介绍的是其中一种方法。基本原理:当鼠标点击当前IE页面时,获取鼠标的坐标位置,根据鼠标位置获取当前页面的句柄,然后根据句柄,调用win32的东西进而获取页面内容。感兴趣的朋友可以参考下本文
    2021-06-06
  • C#使用winform实现进度条效果

    C#使用winform实现进度条效果

    这篇文章主要为大家详细介绍了C#使用winform实现进度条效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • C#采用HttpWebRequest实现保持会话上传文件到HTTP的方法

    C#采用HttpWebRequest实现保持会话上传文件到HTTP的方法

    这篇文章主要介绍了C#采用HttpWebRequest实现保持会话上传文件到HTTP的方法,很实用的功能,需要的朋友可以参考下
    2014-08-08
  • C#中创建统一API接口的实现方案

    C#中创建统一API接口的实现方案

    在 C# 中创建统一 API 接口需要从架构设计、技术选型和代码实现等多个层面进行规划,本文给大家详细介绍了实现方案和完整示例代码,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2025-04-04
  • c#文件下载示例的4种方法分享

    c#文件下载示例的4种方法分享

    这篇文章主要介绍了c#文件下载示例的4种方法,有TransmitFile实现下载,WriteFile实现下载,WriteFile分块下载,流方式下载,需要的朋友可以参考下
    2014-03-03

最新评论