返回「计算机、信息技术与工程」

自己如何实现MeshRender 的效果

更多
Markdown 结构化数据
本文目录 3 个章节

自己如何实现MeshRender 的效果

note · 我的 UWA 问答 本文收录我在 UWA 问答发表的公开回答。问题内容归原提问者;回答保留当时语境,技术结论可能受 Unity 版本、平台和项目条件限制。

问题

我有个需求就是 关卡里的对象 是通过脚本 间接创建的,而不是直接将prefab 拖到场景中。

因此我需要能象 MeshRender 那样直接在场景中显示 并方便我选中与编辑。

代码类似这样:

public class SpawnPrefab : MonoBehaviour

    {

        public GameObject prefabEntity;

         void Start()

         {

              Instantiate(prefabEntity);

        }

    }

MeshRender 有下面两个特性:

  1. 在Editor 模式下 SceneView 与 GameView 下面同时显示
  2. 在运行模式下绘制出的对象可以在 SceneView 下选中

目前我是在OnDrawGizmos 函数中调用 Graphics.DrawMesh 但Scene View中却无法选中,

在Update中绘制 却在 Editor 模式下无法 显示。 我感觉好像尝试的方向错了。

  • 提问者:silekey
  • 提问时间:2021-05-09 08:28:02

我的回答

OnDrawGizmos里面绘制显然是不行的,这个函数在打包出来Runtime都不会调用。

要在SceneView中选中编辑,一定得是场景中的某个GameObject。

(用GameObject挂MeshRenderer肯定能满足 “SceneView编辑” 和 “运行时脚本创建” 两个需求的。)

如果题主的需求是,一定要用Graphics的立即渲染接口来画Mesh的话。如果要在Editor下显示,给类加一个ExecuteAlways属性就可以了,只是还不能在SceneView中选中编辑。

image.png

如果还想实现Scene窗口下编辑的功能,只能给要绘制的Mesh绑定一个场景中的挂了MeshRenderer的GameObject了。Graphics.DrawMesh绘制的物体的transform与这个GameObject保持一致就行了。如下图,Game窗口为OnPostRender函数中用Graphics.DrawMeshNow函数绘制的效果,Scene窗口中为绑定的用来编辑调整的物体,两者的transform是一致的:

image.png

关键代码如下:

image.png

  • 回答时间:2021-05-09 10:46:29
  • 最后更新:2021-05-09 11:18:06
  • 采纳状态:已采纳

来源与关系