您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了Unity3D如何實現描邊框效果,內容簡而易懂,希望大家可以學習一下,學習完之后肯定會有收獲的,下面讓小編帶大家一起來看看吧。
效果圖如下
將物體添加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條邊通過畫線形式渲染出來!
以上就是關于Unity3D如何實現描邊框效果的內容,如果你們有學習到知識或者技能,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。