• 目前,UGUI问世不过半年(其随着Unity 4.6发布问世),而市面上商用的产品,UI控件的至尊为NGUI:影响力和广度(可搜索公司招聘Unity 3D,常常能看到对NGUI关键词)。 NGUI虽然不是Unity 官方原生的,但以其强大的能力...
    
    目前,UGUI问世不过半年(其随着Unity 4.6发布问世),而市面上商用的产品,UI控件的至尊为NGUI:影响力和广度(可搜索公司招聘Unity 3D,常常能看到对NGUI关键词)。 NGUI虽然不是Unity 官方原生的,但以其强大的能力和友好的操作性,成为了事实上的王者—-无他,OnGUI太挫了。

     

    通过导入自定义包,会出现如下的截图–这里我使用的是NGUI V3.6.8版本。

    image

     

    在其官方demo中,这个demo给我留下了非常酷的印象(右上角NGUI的logo,好像电影中维京人的帽子?):

    image

     

    NGUI代码的样例,极为丰富,反复临摹,可学很多东西,这里就不一一列举了,仅对学习进行小结。image

     

    • UI Root

    NGUI的UI Root类似UGUI Canvas.Screen.Camera模型;UI Root是所有NGUI控件的根元素。

    image

     

    创建一个NGUI元素后,在UI Root下自动带一个Camera。

    另外,NGUI是第三方的,故无法像UGUI一样在Hierarchy中通过快捷键添加UI元素:

    image

    可通过主菜单–NGUI添加组件

    image

     

    还可以在Scene中,通过右键菜单添加UI组件(右键菜单提供了添加脚本、Help跳转到官网tasharen的Tip功能,很棒。)

     

    image

     

    • 原生的UI组件有2个:

    常使用的UI组件有2个:Lable & Sprite,其他组件是组合这2个UI组件实现的。

    image

     

    更多的常用控件,是通过Prefab Tool提供的,如Button、Slider、CheckBox等。

    image

     

    在此基础上,你也可以自定义你的UI控件,保存为Prefab即可,然后拖入到NGUI的Prefab Toolbar中保存起来。

     

    • 交互

      NGUI中实现控件的交互有2个步骤,主要是用碰撞检测(Trigger)和脚本实现,使用起来方便的很—成熟、好用。

    1 添加Box Collider
    2 添加事件脚本( *.cs)实现

     

      NGUI默认提供了丰富了UI脚本,几乎囊括了能用到的所有脚本—可在此基础上,继续通过扩展代码完成您的需求。

    image

    • 动画

    类似交互功能,动画也是通过脚本组件实现的。 NGUI自带的Tween 有10个脚本

    clip_image001

    • Dock:Anchors

    image

    制作复杂UI布局的时候,Anchors就显得尤为关键,故NGUI也提供了非常方便的Anchors功能—默认不开启,通过选择Type=Unifed可打开Anchors功能,设置Target对象,同时设置Left、Right、Right、Bottom、Top即可实现,相对比较方便。(默认的Target对象是该UI的父对象)

     

    • 图集(Atlas Maker):图片的批量压缩,提高性能。

    Atlas 这个单词很诡异,以前没有见过,搜索了一下bing,发现很有趣:

    image

     

    使用Atlas Maker,主要目的是对批量图片进行压缩,成为一张图片,使用的时候通过offset可获得指定的图片。这个技术在GIS加载图片、Web加载图片中曾经用过。

    Atlas Maker经过处理多个选择的图片后,最后产生了3个文件:

    • MyAtlas.png
    • MyAtlas.prefab
    • MyAtlas.mat

     

     

    其他tip:

    获取NGUI当前控件的设置值:volumn = UIProgressBar.current.value;

    NGUI控件添加父子关键:NGUITools.AddChild(sprite.gameObject, item.gameObject);

    NGUI一些不太好用的东西:

    • 多个Panel无法Move和对齐—panel没有边线,多个Panel不好控制。

    clip_image001[4]

     

    NGUI摆放组件,移动非常不爽:一个是Camera取消不了–Gizmos尝试不行;另外移动和缩放很容易搞错。

    clip_image001[10]

     

    • NGUI的Sprite的切图SlicedSprite九宫切图,是通过设置数字修改的

    clip_image001[6]

    widget属性,pivot,depth和size–NGUI的核心东东

    clip_image001[8]

    • Pivot:中心点–对齐用
    • Depth:多个控件渲染的顺序【数字越高,显示优先级越高; 使用起来有点坑–设置错误则显示不了啦】
    • Size、Aspect:大小和放大

     

    总结: 

    尽管我个人比较看好UGUI,要学就学新的,1年后UGUI就成熟了嘛!  但是为了看懂一些“参考代码”,NGUI也是有必要学习、学习的,  且NGUI有较丰富的第三方UI插件生态圈呢,如NGUI HUB, TKTR等。

    展开全文
  • c# GDI+简单绘图(一)

    2016-06-05 23:46:06
    c# GDI+简单绘图(一) http://www.cnblogs.com/stg609/archive/2008/03/16/1108333.html  最近对GDI+这个东西接触的比较多,也做了些简单的实例,比如绘图板,仿QQ截图等.  最早接触这个类,是...
    c# GDI+简单绘图(一)


    http://www.cnblogs.com/stg609/archive/2008/03/16/1108333.html

        最近对GDI+这个东西接触的比较多,也做了些简单的实例,比如绘图板,仿QQ截图等.
      最早接触这个类,是因为想做仿QQ截图的效果.巧的很,学会了如何做截图后,.NET课堂上老师也正巧要讲关于c#绘图方面的知识,并且我自己又在网上学习金老师的培训班,也是要用到这个类.在学习中有一些体会,所以准备把这些体会记下来,因为内容比较多,可能我会分几次写.

      废话不多说了,我们先来认识一下这个GDI+,看看它到底长什么样.

    GDI+:Graphics Device Interface Plus也就是图形设备接口,提供了各种丰富的图形图像处理功能;在C#.NET中,使用GDI+处理二维(2D)的图形和图像,使用DirectX处理三维(3D)的图形图像,图形图像处理用到的主要命名空间是System . Drawing:提供了对GDI+基本图形功能的访问,主要有Graphics类、Bitmap类、从Brush类继承的类、Font类、Icon类、Image类、Pen类、Color类等.

    大概了解了什么是GDI+后,我们来看一下绘图要用到的主要工具,要画图,肯定要画板吧,在C#中画板可以通过Graphics这个类来创建,有了画板,总得弄个笔什么之类的吧,不然怎么画呀,难不成我们用手指画.笔又可以分好多种类,比如铅笔,画刷等.它们的区别主要是铅笔可以用来画线条,而画刷呢,嘿嘿,自己考虑下.在c#中我们可以用Pen,Brush类来实现类似功能.颜料则自然是用Color类了.

    有了工具,我们就可以开始动手了!(所需命名空间:using System.Drawing;)

    实现效果:在空白窗体中画基本图形

    首先准备一个画板:
    创建一个画板主要有3种方式:
    A: 在窗体或控件的Paint事件中直接引用Graphics对象 
    B: 利用窗体或某个控件的CreateGraphics方法
    C: 从继承自图像的任何对象创建Graphics对象
    这次我们就先以A为例说明问题:

      private void Form1_Paint(object sender, PaintEventArgs e)
            {
                Graphics g = e.Graphics; //创建画板,这里的画板是由Form提供的.
            }


    然后,我们要只笔:

    private void Form1_Paint(object sender, PaintEventArgs e)
            {
                Graphics g = e.Graphics; //创建画板,这里的画板是由Form提供的.
                Pen p = new Pen(Color.Blue, 2);//定义了一个蓝色,宽度为的画笔
            }

    接下来我们就可以来画画了.

    private void Form1_Paint(object sender, PaintEventArgs e)
            {
                Graphics g = e.Graphics; //创建画板,这里的画板是由Form提供的.
                Pen p = new Pen(Color.Blue, 2);//定义了一个蓝色,宽度为的画笔
                g.DrawLine(p, 10, 10, 100, 100);//在画板上画直线,起始坐标为(10,10),终点坐标为(100,100)
                g.DrawRectangle(p, 10, 10, 100, 100);//在画板上画矩形,起始坐标为(10,10),宽为,高为
                g.DrawEllipse(p, 10, 10, 100, 100);//在画板上画椭圆,起始坐标为(10,10),外接矩形的宽为,高为
            }


            效果图如下:

     

     这片文章其实我在我的还一个博客http://blog.54master.com/index.php/586951/ 中有发布过,但是续片一直发不上,不知道怎么回事,所以搬家到这,重新发!

     

    其它相关链接:

          c# GDI+简单绘图(一):介绍GDI+ 基础知识

          c# GDI+简单绘图(二):介绍GDI+绘图知识

          c# GDI+简单绘图(三):实现仿QQ截图功能     

          c# GDI+简单绘图(四): 实现仿WINDOWS 画板功能

    作者:stg609

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    本人博客已经转移到Charley Blog

    分类: .Net WinForm开发
    标签: GDI+, Graphics, C#, 绘图
    展开全文
  • 关于平滑曲线,相信很多人在网上提过这个问题,如何画出平滑曲线?我也很想知道答案,究竟如何...看到最多的是用类似gdi的moveto,lineto实现,gdi+则是drawline,但这个方案有一个很明显的漏洞:在MouseMove事件里,当

    关于平滑曲线,相信很多人在网上提过这个问题,如何画出平滑曲线?我也很想知道答案,究竟如何才能在MouseMove事件里画出真正平滑又柔和的曲线?注意本文讨论的重点是在MouseMove事件里,并非相对固定的几个点
    针对这个问题,网上给出了很多种方案。看到最多的是用类似gdi的moveto,lineto实现,gdi+则是drawline,但这个方案有一个很明显的漏洞:在MouseMove事件里,当用户快速移动鼠标时,我们可以很明显的看到画出的曲线是由直线段拼接而成,一点都不圆滑,这和我们的主题相差太远,所以否决这种方案。
    当然网上也给出了另一种方案:DrawCurve
    第一次看到这个方法,我就像发现新大陆一样,因为网上给出的效果图确实非常圆滑。
    但很可惜,实践证明,用DrawCurve方法在相对固定的几个点下画曲线确实平滑,但一旦移到MouseMove事件里却出现了各种各样的问题,比如锯齿,“毛刺”等,下图就非常直观的呈现出了这些特征

    有问题理应要有相应的解决方案,很荣幸,我们找到了Pen的线帽(StartCap/EndCap)和联接样式(LineJoin)两个属性,这两个恰恰是刚刚提到那两个问题的“克星”,线帽用来对付锯齿,而联接样式则是用来对付“毛刺”,只要分别设置这三个属性为Round即可,缺一不可哈:)

    未设置线帽的效果

     

    未设置联接样式的效果

     

    只有三个属性设全了,才能画出“真正”完美的平滑曲线

     

    附上测试代码,有兴趣的读者不妨一试

        public partial class Form1 : Form
        {
            private bool initial = true, startDraw;
            List<Point> pList = new List<Point>();
    
            public Form1()
            {
                InitializeComponent();
            }
    
            protected override void OnPaint(PaintEventArgs e)
            {
                base.OnPaint(e);
                if (initial) //窗体刚加载时不重绘
                {
                    return;
                }
                Graphics g = e.Graphics;
                g.SmoothingMode = SmoothingMode.AntiAlias;
                using (Pen p = new Pen(Color.Black, 15))
                {
                    //设置起止点线帽
                    p.StartCap = LineCap.Round;
                    p.EndCap = LineCap.Round;
    
                    //设置连续两段的联接样式
                    p.LineJoin = LineJoin.Round;
    
                    g.DrawCurve(p, pList.ToArray()); //画平滑曲线
                }
            }
    
            private void Form1_MouseDown(object sender, MouseEventArgs e)
            {
                if (e.Button == MouseButtons.Left)
                {
                    initial = false;
                    startDraw = true;
                    pList.Add(e.Location);
                }
            }
    
            private void Form1_MouseMove(object sender, MouseEventArgs e)
            {
                if (e.Button == MouseButtons.Left && startDraw)
                {
                    pList.Add(e.Location);
                    this.Refresh();
                }
            }
    
            private void Form1_MouseUp(object sender, MouseEventArgs e)
            {
                if (e.Button == MouseButtons.Left)
                {
                    startDraw = false;
                }
            }
        }


     

    展开全文
  • 转至:http://www.cnblogs.com/stg609/archive/2008/03/30/1129221.html 前几篇我已经向大家介绍了... 个人认为如果想做一个功能强大的绘图工具,那么单纯掌握GDI还远远不够,我的目前也只能做一个比较简单的绘图工

          转至:http://www.cnblogs.com/stg609/archive/2008/03/30/1129221.html

          前几篇我已经向大家介绍了如何使用GDI+来绘图,并做了一个截图的实例,这篇我向大家介绍下如何来做一个类似windows画图的工具.
      个人认为如果想做一个功能强大的绘图工具,那么单纯掌握GDI还远远不够,我的目前也只能做一个比较简单的绘图工具了.不足之处,欢迎大家讨论!


      先来看一下最终效果吧:

      
      主要实现功能:画直线,矩形,橡皮,圆形,切换颜色,打开图片,保存图片,清除图片,手动调节画布大小;软件刚启动时,为一张空白画布,我们可以直接 在画布上绘画,也可以通过菜单中的“打开”,导入一张图片,然后我们就可以在这张图片上进行绘制。
      平台:VS2005 WINFORM

      由于代码过多,在这里只简要介绍下制作步骤,提供大家工程下载.
      1.对整个界面进行布局.
      2.实现绘图工具的功能
      3.实现颜色拾取的功能,这里我们直接拿上次写的自定义控件来用.
      4.实现菜单功能
      5.实现手动调节画布大小的功能
      6.测试 

      实现绘图工具的功能
      为了让代码藕合度小点,稍许用了些设计模式,因为不是很会,所以代码还是有点乱乱的,嘿嘿!关于绘图工具的这些功能块全部写在了DrawTools这 个类里.那么在主窗体中,只需要调用这个类来完成绘制就行了,而不需要过多的涉及到具体的绘图代码。绘图工具这个类提供的主要工具就是:铅笔、橡皮、直 线、矩形、圆形、实心矩形、实心圆形。关于这些功能块的代码,并不难,只要大家对认真看过前几篇内容,那应该都看得懂。
      这里要注意以下几点:
      1.如何防止记录不必要的绘图过程中的痕迹?
      这个问题在第三篇 中 有提到过,大家不妨先去看看那一篇。为了让代码看起来可读性高点,我设置了两个Image变量,finishingImg用来保存绘图过程中的痕迹,orginalImg用来保存已完成的绘图过程和 初始时的背景图片。
      2.这个类如何与主窗体进行通信?
      当然如果直接将这些功能块写在主窗体中自然没有这个问题。但是那样代码会显得很混杂,如果只是工具代码出现问题就需要改整个项目。我在这里通过定义方 法和属性,让主窗体通过给属性赋值将画板画布以及颜色什么的信息传给这个工具类,然后通过调用相应的工具方法来使用这些工具。
      3.关键属性
      要想让这些工具能正常使用,必须传递给他以下几样东西:目标画板(也就是picturebox),绘图颜色,原始画布。


      实现菜单功能
      
      这里就需要我们对文件的操作有一点了解,大家可以去查一下相关资料。
      难点主要就是“打开”这个菜单项的实现
      我们要实现将打开后的图片在修改后重新保存就必须让文件在打开后就能关闭,否则就会因为文件打开而无法覆盖原文件。就会导致编译时弹出“GDI  一般性错误”。所以根据网上其它朋友的做法就是先将打开的图片通过GDI+将图片画到另一个画布上,然后及时关闭打开的图片和用来绘制该图片的画板。详见http://www.wanxin.org/redirect.php?tid=3&goto=lastpost

      private   void  openPic_Click( object  sender, EventArgs e)
            
    {
                OpenFileDialog ofd 
    =   new  OpenFileDialog(); // 实例化文件打开对话框
                ofd.Filter  =   " JPG|*.jpg|Bmp|*.bmp|所有文件|*.* " ; // 设置对话框打开文件的括展名
                 if  (ofd.ShowDialog()  ==  DialogResult.OK)
                
    {
                    Bitmap bmpformfile 
    =   new  Bitmap(ofd.FileName); // 获取打开的文件
                    panel2.AutoScrollPosition  =   new  Point( 0 , 0 ); // 将滚动条复位
                    pbImg.Size  =  bmpformfile.Size; // 调整绘图区大小为图片大小

                    reSize.Location 
    =   new  Point(bmpformfile.Width, bmpformfile.Height); // reSize为我用来实现手动调节画布大小用的
                    
    // 因为我们初始时的空白画布大小有限,"打开"操作可能引起画板大小改变,所以要将画板 重新传入工具类
                    dt.DrawTools_Graphics  =  pbImg.CreateGraphics();

                    Bitmap bmp 
    =   new  Bitmap(pbImg.Width, pbImg.Height);
                    Graphics g 
    =  Graphics.FromImage(bmp);
                    g.FillRectangle(
    new  SolidBrush(pbImg.BackColor),  new  Rectangle( 0 0 , pbImg.Width, pbImg.Height)); // 不使用这句话,那么这个bmp的背景就是透明的
                    g.DrawImage(bmpformfile,  0 0 ,bmpformfile.Width,bmpformfile.Height); // 将图片画到画板上
                    g.Dispose(); // 释放画板所占资源
                    
    // 不直接使用 pbImg.Image = Image.FormFile(ofd.FileName)是因为这样会让图片一直处于打开状态,也就无法保存修改后的图片
                    bmpformfile.Dispose(); // 释放图片所占资源
                    g  =  pbImg.CreateGraphics();
                    g.DrawImage(bmp, 
    0 0 );
                    g.Dispose();
                    dt.OrginalImg 
    =  bmp;
                    bmp.Dispose();
                    sFileName 
    =  ofd.FileName; // 储存打开的图片文件的详细路径,用来稍后能覆盖这个文件
                    ofd.Dispose();

                }

            }

      清除图像其实就是用白色填充整个画布
      其它的都比较简单,这就不具体讲了。

      实现手动调节画布大小
      
    网上有人说使用API,但是个人觉得还是使用其它控件帮忙比较简单,至少我们还看得懂。
      思路:放置一个picturebox1(尺寸为5*5),将它固定在主画板的右下角,然后改变鼠标进入时的Cursor为箭头形状,设置鼠标按下移动 时的事件,让该picturebox1 跟随鼠标移动。当鼠标松开时,将主画板的右下角坐标调整为picturebox1的坐标。
      下面来看下代码:
      其中的reSize就是我们用来帮忙的picturebox控件 

             private   bool  bReSize  =   false ; // 是否改变画布大小
             private   void  reSize_MouseDown( object  sender, MouseEventArgs e)
            
    {
                bReSize 
    =   true ; // 当鼠标按下时,说明要开始调节大小
            }


            
    private   void  reSize_MouseMove( object  sender, MouseEventArgs e)
            
    {
                
    if  (bReSize)
                
    {
                    reSize.Location 
    =   new  Point(reSize.Location.X  +  e.X, reSize.Location.Y  +  e.Y);

                }

            }


            
    private   void  reSize_MouseUp( object  sender, MouseEventArgs e)
            
    {
                bReSize 
    =   false ; // 大小改变结束
                
    // 调节大小可能造成画板大小超过屏幕区域,所以事先要设置autoScroll为 true.
                
    // 但是滚动条的出现反而增加了我们的难度,因为滚动条上下移动并不会自动帮我们调整图片 的坐标。
                
    // 这是因为GDI绘图的坐标系不只一个,好像有三个,没有仔细了解,一个是屏幕坐标,一 个是客户区坐标,还个是文档坐标。
                
    // 滚动条的上下移动改变的是文档的坐标,但是客户区坐标不变,而location属性就 属于客户区坐标,所以我们直接计算会出现错误
                
    // 这时我们就需要知道文档坐标与客户区坐标的偏移量,这就是 AutoScrollPostion可以提供的

                pbImg.Size 
    =   new  Size(reSize.Location.X  -  ( this .panel2.AutoScrollPosition.X), reSize.Location.Y  -  ( this .panel2.AutoScrollPosition.Y));
                dt.DrawTools_Graphics 
    =  pbImg.CreateGraphics(); // 因为画板的大小被改变所以必须重新赋值

                
    // 另外画布也被改变所以也要重新赋值
                Bitmap bmp  =   new  Bitmap(pbImg.Width, pbImg.Height);
                Graphics g 
    =  Graphics.FromImage(bmp);
                g.FillRectangle(
    new  SolidBrush(Color.White),  0 0 , pbImg.Width, pbImg.Height);
                g.DrawImage(dt.OrginalImg, 
    0 0 );
                g.Dispose();
                g 
    =  pbImg.CreateGraphics();
                g.DrawImage(bmp, 
    0 0 );
                g.Dispose();
                dt.OrginalImg 
    =  bmp;

                bmp.Dispose();
            }

      效果如下图(仔细看白色区域的右下角):
      
      此时就可以通过拖动那个小方块来调节图片大小了。
      
      这样,主要的问题差不多已经解决了,但还是有不足这处,欢迎大家提出宝贵的意见。

      绘图工程 源码:   

          http://download.csdn.net/source/2350946

    展开全文
  • 闲来无事,把在Unity开发中使用的C#知识点总结一下,自己在带团队新人的时候,好多知识点它们并不是很清楚,另外也不知道自己哪方面不足。其实在面试的时候,主考官也会问到相关的问题,项目开发中这些知识点是必备...

    今天是大年初二,在此祝各位程序员朋友身体健康,猪年大吉。闲来无事,把在Unity开发中所使用的C#知识点总结了一下,因为自己在带团队新人的时候,好多知识点它们并不是很清楚,编写代码还是局限于“Hello World”的写法,编写能力一直迟迟得不到提高,另外,只是满足于把分配的功能实现出来就完事了。自己对自己的能力也没有一个清晰的认识,在这里也是为了能够帮助他们,利用休息时间写篇博客,其实在面试的时候,主考官也会问到相关的问题,在项目开发中这些知识点是必备的,掌握了这些知识点,再模块化编程就容易多了。下面我把总结的给读者展示一下:
    在这里插入图片描述
    C#作为面向对象语言,面向对象语言的三大特性就是,继承,封装,多态。继承就是子类继承父类,有单继承,多继承,虚拟继承等等。Unity它自己也为我们提供了很多继承的代码,比如:
    它的最顶层是Object,Component,Behaviour,MonoBehaviour,我们自己编写的脚本要挂接到对象上就必须继承MonoBehaviour。封装主要是用于对外提供访问的接口,避免直接修改内部数据。比如我们定义的变量,有两种访问方式:一种是直接访问,另一种是将其放到函数中去获取;第一种不安全会被修改,第二种是安全的,这也是我们说的接口封装。多态,主要是函数的同名不同参。这三种特性是最基本的,必须要掌握的。

    • abstract class 抽象类

    它是把物体的共性抽离出来,既可以把共性的方法实现出来,也可以提供子类实现的接口。它的优点是减少代码量,但它不可以new对象。子类可以直接调用抽象类声明的public函数。游戏中比如我们的配置文件的加载读取,举例如下所示:
    在这里插入图片描述这样子类可以直接调用我们的Load函数,而子类具体实现OnLoad函数,如下所示:

    在这里插入图片描述

    • partial类

    有partial修饰的类,我们可以协同开发,换句话说,我们多个人可以共同写一个类,如下所示:

    在这里插入图片描述
    这样就避免了代码冲突,而且根据功能分类比较清晰。

    • interface

    只是提供接口,子类具体实现方法,在类的前面加上interface,在游戏中使用的也是比较广泛,示例如下所示:

    在这里插入图片描述

    • template模板类

    在游戏中经常使用比如我们加载不同的配置文件,每个配置文件有自己的类结构体,需要具体实现,这样就非常适合使用模板函数解决问题,还有增加组件,也适用于模板等等。当然模板也适合用于模板类,比如我们的单例模板,管理类模板等等。其实Unity它自身的类也大量使用了模板函数,在项目中举个简单的例子,如下所示:

    在这里插入图片描述
    where表示的是条件限制,new表示的必须要有无参数的构造函数。

    • delegate委托

    类似C++中的指针,是一种回调函数。委托是比较常用的,比如我们的UI中使用的Button等响应事件都可以用委托,还有事件监听也常用delegate等等,这个比较常用就不举例子了。

    • attribute

    在游戏项目中也经常使用,attribute,Attribute本质上就是一个类,它附着在目标对象上最终实例化,attribute实例化也是有自己的特点:
    第一、不通过new操作符来产生实例,而是使用在方括号里调用构造方法来产生实例。
    第二、方括号必须紧挨着放置在被附着目标的前面。
    第三、不能使用对象初始化器给对象的属性(Property)赋值,必须使用含参构造方法对Attribute实例中的属性赋值。
    详情可以参考网址:https://docs.microsoft.com/en-us/dotnet/api/system.attribute?redirectedfrom=MSDN&view=netframework-4.7.2

    我们说的用ILRuntime进行热更新同样可以使用Attribute帮助我们解决,下面介绍我们在项目中的应用,我们使用的是自定义属性,注意必须继承System.Attribute。
    在这里插入图片描述
    在上面中的方括号中使用的AttributeUsage就是属性的设置,继续我们自定义的实现,这个是具体实现了。如下所示:

    在这里插入图片描述
    我们自定义的属性写完了如何使用了,截取一段代码给读者简单的展示一下,代码类似如下所示:

          component = (Component)Activator.CreateInstance(type); 
          aAwakeSystem = this.awakeSystems[component.GetType()];  
          IAwake iAwake = aAwakeSystem as IAwake; 
          iAwake.Run(component);
    

    我们还可以将其打包成dll库,这样就可以做到热更新了。

    • Action和Func
      这两个函数也是委托,只是它是C#内置的委托,Action不返回任何值,Func是返回值的。它两种使用方式我们经常在场景加中使用。在项目中的应用如下所示:

    在这里插入图片描述

        public void DownloadResources(Action<List<string>> downloadComplete, Action<int, int, float> downloadProgress, Func<string, bool> filter, params string[] resources)
        {
            DownloadResources(downloadComplete, downloadProgress, filter, false, resources);
        }
    

    前面代码使用了Action不带参数,后面使用了Action带参数的以及Func带参数的。我们将其应用在资源下载,最终在程序中的调用如下所示:
    在这里插入图片描述

    • 总结
      以上所列知识点,都是在项目中经常使用的,在这里并没有详细的介绍,MSDN帮助文档介绍的很详细,如果读者不是很清楚可以自行查阅,在这里只是介绍了游戏中利用这些知识点帮助我们解决问题,需要开发者熟练掌握。
    展开全文
  • 绘图引擎方面,Windows下常用的为GDIGDI+、DirectX、OpenGL等引擎,而Winform、MFC、WPF、Qt等则是用来实现对这些引擎调用的工具,属于更上层的范围,这几个绘图引擎中,前三者都是微软自己的东西,因此如果用C#来...
  • Unity C# 与C++服务器通信踩坑 目录 Unity C# 与C++服务器通信踩坑 API与C#数据结构类型对应关系表 C#代码 C++代码 API与C#数据结构类型对应关系表  API与C#的数据类型对应关系表 API数据类型 ...
  • using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;...using
  • C# GDI+绘图 绘制矩形的bug “我的绘图绘制矩形只能mousedown然后鼠标向右下时才能画出,不然就报错” “我使用g.DrawRectangle绘制矩形明知道向‘右上、左下、左上’时把width和height取绝对值,然后改变参数里...
  • 1,直接使用GDI+ 的方法,利用矩阵运算,透视投影,再做Rasterization,利用GDI的方法绘制到窗口上,所有的东西都要自己来实现。 2,采用OpenGL, 利用跨平台的opengl api绘制三维图形。 3,采用Unity3d或unreal...
  • C#FlappyBird完整项目包

    2020-06-18 16:02:20
    模仿的FlappyBird,功能都实现了,代码不多,一看就懂,项目介绍博客地址:http://blog.csdn.net/q594076608/article/details/40217039
  • 关于GDI+使用的心得

    2018-01-23 10:16:32
    最近项目开发使用到GDI+来创建JPG文件,使用过程中出现了很多问题,使用LockBits函数始终无法得到Bitmap的数据,在网上反复查找最终终于查到原因所在,在使用GDI+的时候首先必须对GDI+的环境进行初始化,即在调用GDI...
  • C#高效绘图(转)

    2016-06-11 18:59:54
    C#高效绘图(转) 2013-12-26 16:01 10938人阅读 评论(1) 收藏 举报  分类:   C#(235)  双缓冲技术 双缓冲是将图片在显示到DC前,现在要内存建一个DC,也就是用于存储这张图片...
  • 方法一、利用背景覆盖   SolidBrush sb = null;  Rectangle r;  private void GraphicsDeviceInterfacePlusForm_Load(object sender, EventArgs e)  {  g = this.CreateGraphics();  ...
  • 透明、半透明原理:看画刷的颜色,Color的第一个参数指定透明值,范围0-255,0全透明,255不透明 1.新建MFC工程,名为newtou 2.添加头文件 #include ...//Gdi+初始化 GdiplusStartupInput gdip
  • C#中如何生成矢量图

    2019-01-10 10:45:01
    主要的功能就是使用C#画矢量图,然后导出到Word、Excel、Powerpoint中,并且能够再次被编辑。以下是解决过程: 首先应该确定在Office文档中可编辑图形使用的格式;学习了相关资料,了解到Office文档主要支持三种...
  • C#植物大战僵尸源码

    2020-05-17 10:40:24
    C#植物大战僵尸源码,基于C# GDI+构建,实现具体的游戏封装和渲染
  • C#对图像重新着色

    2017-01-06 10:59:06
    C#对图像重新着色 1、Bitmap 类 构造函数 Bitmap(String, Boolean):从指定的文件初始化 Bitmap 类的新实例。 属性 Height:获取此 Image 的高度(以像素为单位)。 (继承自 Image)...
  • 摸索了3天,终于成功实现了使用已知byte[]数据,生成Bitmap(256色灰度 BMP位图)。...如何在C#(GDI+)中操作Bitmap,获取位图的各种数据,就像在C++|中一样 如何修改Bitmap的调色板 如何解决位图显示错位的
  • 【平移】 private void btnTranslate_Click(object sender, EventArgs e) { Graphics graphics = this.CreateGraphics(); // 红色笔 Pen pen = new Pen(Color.Red, 5); ...
1 2 3 4 5 ... 15
收藏数 288
精华内容 115
热门标签