第七章 u3d中的定制特性

dll怎么用:

  就在vs里面生成,然后在使用的项目里引用包含以下这个dll就可以了

  至于unity,直接放进去

  注意:U3D目前最多支持.NET 3.5版本,所以生成DLL应该注意下版本问题

  (如果没有刷出来,就重启下vs。。。。。)

非托管代码的dll调用方法:

  http://www.ceeger.com/forum/read.php?tid=1097这里有比较详细的讲解。

Serializable特性

  就是序列化,在第十章会有详尽的介绍,这里简单写一个例子来说明下好了。

human.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

[Serializable]
public enum Sex {
    male,female,unknow=10086
}
[Serializable]
public class Human {
    Sex __sex;
    string name;
    int age;
    //初始化一个人类
    public Human(Sex sex, string Name, int Age) {
        __sex = sex;
        name = Name;
        age = Age;
    }

    public override string ToString()
    {

        return "我的名字是:"+name+"  年龄:"+age+"  性别是:"+(__sex==Sex.male?"男性":"女性");
    }

}

testdll.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using myfirstdll;
using System.Runtime.InteropServices;

//系统IO
using System.IO;
//二进制格式化器
using System.Runtime.Serialization.Formatters.Binary;

public class testdll : MonoBehaviour {

    Human xiaoming; 

    // Use this for initialization
    void Start () {
        xiaoming = new Human(Sex.male, "小明", 22);
        FileStream f = new FileStream("xiaoming.dat", FileMode.Create,FileAccess.ReadWrite);
        BinaryFormatter bf = new BinaryFormatter();
        bf.Serialize(f, xiaoming);
        f.Close();

    }

    // Update is called once per frame
    void Update () {

    }

    void OnGUI() {
        if (GUI.Button(new Rect(0, 0, 300, 300), "反序列化")) {
            BinaryFormatter bf2 = new BinaryFormatter();
            FileStream f2 = new FileStream("xiaoming.dat", FileMode.Open, FileAccess.Read);
            Human human = bf2.Deserialize(f2) as Human;
            print(human);
            f2.Close();
        }

    }
}

在第十章会做详细的讲解

定制特性到底是什么呢?简单来说定制特性是一个类型的实例。Mono之所以能够跨平台其中原因之一是它符合CLS(公共语言规范)的要求,而根据公共语言规范的要求定制特性类必须直接或者间接从公共抽象类System.Attribue派生。

unity3d中最常用的定制特性:定制菜单

假如说想在Component菜单里加入一个项目,实现一个添加对应脚本组件的功能,只需要这样写:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[AddComponentMenu("TestMenu/Editor_Test")]
public class Editor_Test : MonoBehaviour {
    // Use this for initialization
    void Start () {
        print("this is Editor_Test");
    }

    // Update is called once per frame
    void Update () {

    }
}

U3D的一些更常用的特性是在UnityEditor这个命名空间里的

对于UnityEditor的特性,比如MenuItem特性,如果要使用它,就要using UnityEditor

MenuItem特性允许你添加菜单项目到主菜单和检视面板上下文菜单,并且这个特性会把所有的静态方法转变为菜单命令。也就是说这个属性是针对静态方法的。

  关于MenuItem特性的构造方法可以参考文档

  特别提醒的是,可以用多个静态方法来针对一个特性,比如一个方法用来控制是否可用,一个方法用来控制具体的行为。

  实例:

    [MenuItem("TestMenu/DoubleStaticFunction")]
    static void FuncitonBehave() {
        print("InstanceId is :" + Selection.activeGameObject.GetInstanceID());
    }
    [MenuItem("TestMenu/DoubleStaticFunction",true)]
    static bool FunctionAvalible() {
        return Selection.activeObject != null;
    }

  具体问题到时候用的时候去看API就好

关于其他的编辑器编辑功能,先不做介绍了,基本就是UnityEditor里面的内容了。

做一个提醒自己喝水和活动的编辑器窗口实例好了。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

public class Editor_WindowTest : EditorWindow {

   public    System.TimeSpan _RestDelatTime;
    System.DateTime _startTime;

    [MenuItem("Health/Drink&Monve")]
    static void ShowAsh()
    {
        Editor_WindowTest window = (Editor_WindowTest)Editor_WindowTest.GetWindow(typeof(Editor_WindowTest));
    }
    void Awake() {
        _startTime = System.DateTime.Now;
        //初始化休息时间
        _RestDelatTime = new System.TimeSpan(0, 30, 0);
    }

    void OnGUI() {
        System.DateTime _time=System.DateTime.Now;
        System.TimeSpan _timeSpan = _time - _startTime;
        GUILayout.Label("程序员健康系统");
        GUILayout.Label("你已经坐了:"+_timeSpan.Hours+"小时 "+_timeSpan.Minutes+"分钟 "+_timeSpan.Seconds+"秒 ");
        GUILayout.Label("休息的时间间隔:" + _RestDelatTime);

        if (_timeSpan.Hours > _RestDelatTime.Hours) {
            this.ShowNotification(new GUIContent("坐太久了!需要活动和喝水!"));
            _startTime = System.DateTime.Now;
        }
        else if ((_timeSpan.Hours == _RestDelatTime.Hours) && _timeSpan.Minutes >= _RestDelatTime.Minutes)
        {
            this.ShowNotification(new GUIContent("坐太久了!需要活动和喝水!"));
            _startTime = System.DateTime.Now;
        }
    }

}

(就不要吐槽写得烂了……能用就行。。。)

总结下:

  感觉这些东西还是挺有用的,能开发一些小但是实用的小工具。。。也可能会陷入“不务正业系列”,比如我的这个IDE:

(也许有一天Unity也会变成这样。。。想想就开心23333)

而且也能用一些工具来缓解开发的压力了,比如一个简单的GAL game的模板?或者是给那些愚蠢的策划用的开发工具?

日后会好好开发♂这个功能

时间: 2024-10-12 00:53:19

第七章 u3d中的定制特性的相关文章

第七章 Java中的13个原子操作类

当程序更新一个变量时,如果多线程同时更新这个变量,可能得到期望之外的值,比如变量i = 1:A线程更新i + 1,B线程也更新i + 1,经过两个线程操作之后可能i不等于3,而是等于2,.因为A和B线程在更新变量i的时候拿到的i都是1,这就是线程不安全的更新操作,通常我们会使用synchronized来解决这个问题,synchronized会保证多线程不会同时更新变量i. 而Java从JDK1.5开始提供了java.util.concurrent.atomic(以下简称Atomic包),这个包中

读《大道至简》第七章·第八章感想

第七章 现实中的软件工程 第八章 是思考还是思想 软件工程是一门研究用工程化方法构建和维护有效的.实用的和高质量的软件的学科.它涉及程序设计语言.数据库.软件开发工具.系统平台.标准.设计模式等方面. 在现代社会中,软件应用于多个方面.典型的软件有电子邮件.嵌入式系统.人机界面.办公套件.操作系统.编译器.数据库.游戏等.同时,各个行业几乎都有计算机软件的应用,如工业.农业.银行.航空.政府部门等.这些应用促进了经济和社会的发展,也提高了工作效率和生活效率 . 业界现在一般通过互相制衡,各自有各

读《大道至简》第七章第八章有感

我读了<大道至简>的第七章——现实中的软件工程和第八章——是思考还是思想.其中第七章主要讲了现实中的软件工程一些需要注意的地方.而第八章作者则分享了一些他自己在编程过程中的思考和思想.  下面是一些第七章的感想:     第七章讲了世界各杰出软件公司的竞争,讲的是现实中的软件工程,在软件工程技术的竞争中是很残酷的,敌人的敌人就是自己的朋友吧,软件当今不是一些软件工程师之间的争争吵吵,而是大公司之间相互制衡的结果,大公司在相互竞争激烈的时候,忽视了一些小公司,导致这些小公司在激烈的竞争中崛起.大

2016-11-24(C#定制特性)(未完)

--------------------------------------------定制特性--------------------------------------------------- //上面 这段话 是在说  可以创建一个 关键字 定义 我们自己的规则? C#中的定制特性被放在 上面  [定制特性名称(,)]来表示 某某 用了这个定制特性. 还有个前缀,说明 这个定制特性是用在什么样的数据上 比如类 返回值 结构体 ..等等等 不写的话 他会自己判断 用法 [method:定制

深入理解计算机第七章

在第七章链接中,链接可以在编译时由经他编译器完成,也可以在加载时和运行时由动态链接器来完成.链接器处理可以为目标文件的二进制文件,它有三种不同的形式:可重定位和可执行和共享的. 链接器的两个主要的任务是符号解析和重定位,符号解析将文件中的每个全局符号都绑定到一个唯一的定义,而重新定位确定每个符号的最终存储器地址,修改对那些目标的引用. 静态链接是由像GCC这样的编译驱动器调用的. 多个目标文件可以被绒映射到存储器中,并运行这个程序. 加载器将可执行文件的内容映射到存储器,并运行这个程序. 被编译

第七章定制并发类

Java 7 并发编程实战手册目录 代码下载(https://github.com/Wang-Jun-Chao/java-concurrency) 第七章定制并发类 7.1简介 Java并发API提供了大量接口和类来实现并发应用程序.这些接口和类既包含了底层机制,如Thread类.Runnable接口或Callable接口.synchronized关键字,也包含了高层机制,如在Java 7中增加的Executor框架和Fork/Join框架.尽管如此,在开发应用程序时,仍会发现己有的Java类无

七牛云存储还有一个独一无二的特性——支持用户将文件从客户端直传到云服务器中

目前七牛已经拥有数千家客户,你会发现其中有很多都是像知乎.Weico.Camera360.美图秀秀.蝉游记和Vida等UGC(用户产生内容)类产品,尤其是在图片社交领域.这是因为,除了我在前面所说的“云存储”比传统方案更节省成本外,七牛云存储还有一个独一无二的特性——支持用户将文件从客户端直传到云服务器中.因为我看过蝉游记CTO Quake撰文写过这一特性,所以就直接引用他的原文来做说明: 常见的云存储上传文件流程一般如下: 用户 =>应用服务器 =>云存储提供商 这样多了一次上传的流程,和本

通过定制特性灵活判断C# mvc中的action是否需要登录验证

在实现通过定制特性灵活判断mvc中的action是否需要登录验证之前,先简单讲两个知识点: 1.每个action执行前都会先执行OnActionExecuting方法: 2.FCL提供了多种方式来检测特性的存在,比如IsDefined.GetCustomAttributes方法等,IsDefined方法仅仅是判断目标有没有应用指定特性,而GetCustomAttributes方法会构造指定特性的新实例. 一.下面先利用OnActionExecuting和IsDefined这两个方法实现判断act

C++_第七章函数的基本知识_求阶乘的子函数_ 函数参数类型为数组_ 求数组内所有元素和、部分元素和的方法_实现了先从键盘输入到一个数组中,再用for循环取读出数组中的元素 for循环也可以用break来结束循环的

/* 第七章函数的基本知识 */ /*01)c++对于返回值有一定的限制:可以是常量.变量.指针.结构对象或表达式,但不可以是数组02)c++返回数组的方法:将数组作为结构会对象组成部分来返回03)函数遇到return则结束该函数04)如果一个函数的两房额参数类型相同,则必须分别制定每个参数的类型,而不能像声明常规变量那样,将声明组合在一起05)*/ //本代码注意double类型的写法以及double和int类型数据的转换 1 #include <iostream> 2 3 void che