具体的效果链接视频——链接:http://pan.baidu.com/s/1nuAJVSH 密码:4koe
今天主要写一下这个模型包围盒。
包围盒组成部分包含:
1:一个Unity所创建的Cube,如下所示:
通过双面Shader达到如上的效果,双面Shader如何所示:
Shader "Custom/DoubleShader" { PRoperties{ _Color("Main Color", Color) = (1,1,1,1)//Tint Color _MainTex("Base (RGB)", 2D) = "white" {} _MainTex_2("Base (RGB)", 2D) = "white" {} } SubShader{ LOD 100 tags{ "Queue" = "Transparent" "RenderType" = "Transparent" "IgnoreProjector" = "True" } Blend SrcAlpha OneMinusSrcAlpha Pass{ Cull Front Lighting Off SetTexture[_MainTex]{ combine texture } SetTexture[_MainTex] { ConstantColor[_Color] Combine Previous * Constant } } Pass { Cull Back Lighting Off SetTexture[_MainTex_2]{ combine texture } SetTexture[_MainTex_2] { ConstantColor[_Color] Combine Previous * Constant } } }}2:八个Untiy创建的cube组成的顶点:
3:12个自己创建的球体(自己创建的球体减少了面数)
程序计算模型包围盒大小
代码如下所示:using UnityEngine;/// <summary>/// Draw a new MeshBounds/// Made By Bruce.XXQQ/// </summary>public class MeshBounds : MonoBehaviour{ public Transform target = null; Renderer[] renderers; void Start() { if (target == null) target = transform.parent; Reset(); } void Reset() { DeleteAllCollider(target); var center = GetAllBoundsCenter(target,out renderers); ; var bounds = addNewCollider(center, renderers); transform.position = bounds.center; transform.localScale = bounds.size; //update all chirdren localScale Vector3 pscale = transform.lossyScale; for (int i = 0; i < transform.childCount; i++) { Transform s = transform.GetChild(i); Vector3 sc = s.lossyScale; float max = Mathf.Max(sc.x, sc.y, sc.z); s.localScale = new Vector3(max * 1f / pscale.x, max * 1f / pscale.y, max * 1f / pscale.z); } } // delete all collider void DeleteAllCollider(Transform transformTarget) { Collider[] colliders = transformTarget.GetComponentsInChildren<Collider>(); foreach (Collider child in colliders) { DestroyImmediate(child); } } //get all Bounds Center Vector3 GetAllBoundsCenter(Transform transformTarget,out Renderer[] renders) { Vector3 center = Vector3.zero; renders = transformTarget.GetComponentsInChildren<Renderer>(); foreach (Renderer child in renders) { center += child.bounds.center; } center /= transformTarget.GetComponentsInChildren<Renderer>().Length; return center; } // add a new bounds and Collider Bounds addNewCollider(Vector3 center,Renderer[]renders) { Bounds bounds = new Bounds(center, Vector3.zero); foreach (Renderer child in renders) { bounds.Encapsulate(child.bounds); } // add a new collider BoxCollider boxCollider = target.gameObject.AddComponent<BoxCollider>(); boxCollider.center = bounds.center - target.position; boxCollider.size = bounds.size; return bounds; }}运行效果如下所示:
测试unitypackage链接:链接:http://pan.baidu.com/s/1nvtzm6P 密码:pnii
新闻热点
疑难解答