通过自定义编辑器在场景和资源中创建一个四边形mesh,解决plane多三角形的问题

如果要在场景中现在一个图片,可以用plane。但是plane是由很多三角形组成,渲染效率会降低。因此可以通过脚本绘制一个由2个三角形构成的四边形代替plane.

using UnityEngine; using UnityEditor;

public class AssetDatabase_Test : ScriptableWizard {

       
public string AssetName = "Quad" ;//在资源中的名称
       public string NewGameObjectName = "New Quad";//在场景中的名称
       public string AssetPath="Assets";//资源中的保存路径

       
public float Width= 1.0f ;
       
public float Height= 1.0f ;


       [
MenuItem ( "AssetDatabase/CreateAsset" )]
       
static void CreateExample ()//菜单项
       {
              
ScriptableWizard .DisplayWizard( //创建窗口
                      "CreateAsset" , //窗口标题
                      typeof ( AssetDatabase_Test ), //执行向导类
                      "ok" ); //创建按钮
        
       }

       void OnSelectionChange(){//选择发生改变时调用,选取的资源保存的路径
             if ( Selection .objects != null && Selection .objects.Length == 1 ) {
                     AssetPath= AssetDatabase .GetAssetPath ( Selection .objects[ 0 ]);
              }
       }
       
void OnWizardCreate(){
              Vector3[] Vertices =  {new Vector3 (0,0,0),new Vector3(Width,0,0),new Vector3 (0,Height,0),new Vector3(Width,Height,0) };//四个顶点的位置
              Vector2[] UV_Position = {new Vector2 (0, 0),new Vector2 (1, 0),new Vector2 (0, 1),new Vector2 (1, 1)};//四个UV坐标
               int [] Triangles = new int [] { 3 , 1 , 2 , 2 , 1 , 0 } ;//两个三角形(四方形的四个顶点的标号从左下角按顺时针排列分别是:0,2,3,1;分为两个三角形,注意的是两个三角形都需按顺时针排列,因为逆时针将
                                                         //是反面)
               //创建新的mesh
               Mesh mesh = new Mesh ();
              mesh.name = AssetName;
              mesh.vertices = Vertices;
              mesh.uv = UV_Position;
              mesh.triangles = Triangles;
              mesh.RecalculateNormals ();
              
//在资源面板中生成
               AssetDatabase .CreateAsset (   mesh , AssetDatabase .GenerateUniqueAssetPath(   AssetPath+ "/" +AssetName    ) + ".asset"   );
              
AssetDatabase .SaveAssets ();

              
//在场景中生成
               GameObject plane = new GameObject (NewGameObjectName);
              MeshFilter meshFilter = (MeshFilter)plane.AddComponent (typeof(MeshFilter));// 网格过滤器用于从你的资源中获取网格信息(Mesh)并将其传递到用于将其渲染到屏幕的 网格渲染器 当中。
              plane.AddComponent ( typeof ( MeshRenderer ));//需要有网格渲染器才能显示
              meshFilter.sharedMesh = mesh;
              mesh.RecalculateBounds();
              plane.AddComponent (
typeof ( BoxCollider ));


       }
}
运行结果:



最后可自行添加材质。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值