[Unity] 将prefab在不实例化的情况下绘制到scene视图中

查看:1182 |回复:29 | 2015-6-5 11:56:18

您需要 登录 才可以下载或查看,没有账号?注册

x
效果虽然比较挫,但是好歹想了一个下午了
是想让一个空物体挂上一个脚本之后,添加几个参数之后 就能渲染另一个模型的外形,不需要动作特效等额外信息
本意是想让这个空物体作为一个刷怪点,在场景视图中看到这个空物体的外形就知道是那只怪物,但不希望它在游戏尚未开始前就被实例化。

试过两种方法:
  1. #if UNITY_EDITOR
  2. //-------------------------------------默认能在编辑器中编辑器中执行-----------------------------------------
  3. void OnDrawGizmos()
  4. {
  5.   if(!obj) return;
  6.   smrs = prefab.GetComponentsInChildren<SkinnedMeshRenderer> ();
  7.   for (int i=0; i<smrs.Length; i++) {
  8.    if(smrs[i])
  9.    {
  10.     Gizmos.DrawMesh(smrs[i].sharedMesh,transform.position,Quaternion.Euler(-90f,0f,0f));
  11.    }
  12.   }
  13. }
  14. //---------------------------默认在游戏视图中执行,要在编辑器中执行需要添加属性[ExecuteInEditMode]-----------------------
  15. void OnRenderObject() {
  16.   smrs = prefab.GetComponentsInChildren<SkinnedMeshRenderer> ();
  17.   for (int i=0; i<smrs.Length; i++) {
  18.    if(smrs[i])
  19.    {
  20.     Graphics.DrawMeshNow(smrs[i].sharedMesh, transform.position,  Quaternion.Euler(-90f,0f,0f));
  21.    }
  22.   }
  23. }
  24. // --------------------------------共同点就是,两个方法都无法绘制没有被实例化的Prefab-------------------------------------------
  25. #endif
点击此处复制文本



所以我选择第一种直接绘制Gizmos
后来发现不能绘制的原因是prefab没有被实例化时不能使用自带的GetComponentsInChildren,要自己遍历

  1. public static void GetComponentsInChildren<T>(Transform transform,ref List<T> list)
  2. {
  3.   for (int i=0; i<transform.childCount; i++) {
  4.    Transform trans = transform.GetChild(i);
  5.    T t = trans.GetComponent<T>();
  6.    if(t!=null) list.Add(t);
  7.    GetComponentsInChildren<T>(trans,ref list);
  8.   }
  9. }
点击此处复制文本



最后就是这样
  1. [ExecuteInEditMode]
  2. public class MeshGizmos : MonoBehaviour {

  3.         public string prefabPath = "Assets/Resources/Prefab/test.prefab";

  4.         private SkinnedMeshRenderer[] smrs;
  5.         private List<Mesh> meshes = new List<Mesh>();
  6.         private GameObject prefab;

  7.         #if UNITY_EDITOR
  8.         void Start()
  9.         {
  10.                 prefab = Resources.LoadAssetAtPath<GameObject>(prefabPath);
  11.         }
  12.         
  13.         void OnDrawGizmos()
  14.         {
  15.                 if(!prefab) return;
  16.                 List<SkinnedMeshRenderer> list = new List<SkinnedMeshRenderer> ();
  17.                 Utility.GetComponentsInChildren<SkinnedMeshRenderer> (prefab.transform,ref list);
  18.                 for (int i=0; i<list.Count; i++) {
  19.                         if(list[i]) Gizmos.DrawMesh(list[i].sharedMesh,transform.position,Quaternion.Euler(-90f,0f,0f));        
  20.                 }
  21.         }
  22.         #endif
  23. }
点击此处复制文本



真丑!!!!!!!没贴图!!!!
litu
2015-6-5 11:56:18  
 赞 赞 1

使用道具 登录

29个回答,把该问题分享到群,邀请大神一起回答。
2#
我的帖子不喜欢无意义的自动回复,谢谢诸位的配合
回复 收起回复
2015-6-5 12:05:07   回复
 赞 赞 1

使用道具 登录

3#
很好的一个思路 不知楼主在贴图方面怎么处理
回复 收起回复
2016-8-23 10:56:06   回复
 赞 赞 1

使用道具 登录

4#
确实是第一次见这么做的,很奇特的思路。。。
回复 收起回复
2016-9-1 17:00:19   回复
 赞 赞 1

使用道具 登录

5#
很好的一个思路,
确实是第一次见这么做的
回复 收起回复
2018-10-15 14:28:21   回复
 赞 赞 1

使用道具 登录

6#
回复 收起回复
2018-10-15 14:35:03   回复
 赞 赞 1

使用道具 登录

7#
这个想法比较有意思。
回复 收起回复
2018-10-18 10:39:53   回复
 赞 赞 1

使用道具 登录

8#
分享快乐~~~
回复 收起回复
2018-10-18 11:10:30   回复
 赞 赞 1

使用道具 登录

9#
........................
回复 收起回复
2018-10-18 11:36:58   回复
 赞 赞 1

使用道具 登录

10#
此帖必火!鉴定完毕!
回复 收起回复
2018-10-19 14:35:23   回复
 赞 赞 1

使用道具 登录

11#

资源哪里好,肯定元素找
回复 收起回复
2018-10-19 16:16:49   回复
 赞 赞 1

使用道具 登录

12#
666666666666666
回复 收起回复
2018-10-19 17:18:43   回复
 赞 赞 1

使用道具 登录

13#
每天8回复
回复 收起回复
2018-10-19 18:35:09   回复
 赞 赞 1

使用道具 登录

14#
好资源好资源
回复 收起回复
2018-10-19 18:42:34   回复
 赞 赞 1

使用道具 登录

15#
资源哪里好,肯定元素找
回复 收起回复
2018-10-19 19:47:00   回复
 赞 赞 1

使用道具 登录

16#
666
回复 收起回复
2018-11-7 09:04:24   回复
 赞 赞 1

使用道具 登录

17#

资源哪里好,肯定元素找
回复 收起回复
2018-11-7 09:05:00   回复
 赞 赞 1

使用道具 登录

18#
资源哪里好,肯定元素找
回复 收起回复
2018-11-7 09:26:15   回复
 赞 赞 1

使用道具 登录

19#
资源哪里好,肯定元素找
回复 收起回复
2018-11-7 09:26:18   回复
 赞 赞 1

使用道具 登录

20#
资源哪里好,肯定元素找
回复 收起回复
2018-11-7 09:26:20   回复
 赞 赞 1

使用道具 登录

CG 游戏行业专业问题

Unity3D技术手机游戏引擎手游引擎
12下一页
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表