福彩3d体彩排列三藏机图字谜: 云枫 一些杂乱的代码知识(一)

48
回复
5749
查看
打印 上一主题 下一主题
[ 复制链接 ]
排名
5577
昨日变化

排列三2014079期正版藏机图 www.d0po.cn 13

主题

89

帖子

748

积分

Rank: 9Rank: 9Rank: 9

UID
215257
好友
6
蛮牛币
1805
威望
0
注册时间
2017-3-29
在线时间
354 小时
最后登录
2019-4-18

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

x
本帖最后由 m2675 于 2018-7-3 09:22 编辑

没事记点知识点吧,满五个就写第二篇,欢迎各位评论补充一些东西。

一些杂乱的代码知识(二)

一.Shader
最近想学点Shader,这玩意已经是第三次开始学了,以前都用的VS里的插件,敲起代码来感觉很奇怪。
不知道大家是不是这样,不显示行号,并且很多高亮都没有。


这次准备好好学了,然后问了群里大神用Sublime Text2这个IDE,网上百度就OK了。
然后跟着教程走,到这一步,我就懵逼了。


根本没有UnityShader的选项啊,然后我又百度了好久,找到了一个奇怪的插件安装进去,总算是能用了。
但是当我打算写这篇文章的时候,发现原来在文本框输入ShaderLanguages就好了,内容和那个插件一样,嗯,这要么是我太傻,要么这是一个历史遗留问题吧,反正我是搜不到UnityShader的。

然后问题就来了,Unity里默认用VS打开Shader,所以我总是要在资源管理器里选择.shader文件的打开方式,还好我记得曾经在雨松大神的帖子里看过怎么打开指定后缀文件的办法。

二.如何打开指定后缀文件

[C#] 纯文本查看 复制代码
//====================================
//描 述 :使用SubLime打开后缀为Shader的文件
//作 者 :  momo
//创建时间 :2018/05/15 15:57:46#  
//版 本 :  1.0
// ===============================================
using UnityEngine;
using UnityEditor;
using UnityEditor.Callbacks;

public class MyAssetHandler
{

    [OnOpenAssetAttribute(1)]
    public static bool Step1(int instanceID, int line)
    {

        //string name = EditorUtility.InstanceIDToObject(instanceID).name;
        // Debug.Log("Open Asset step: 1 (" + name + ")");
        return false; // we did not handle the open
    }

    // step2 has an attribute with index 2, so will be called after step1
    [OnOpenAssetAttribute(2)]
    public static bool Step2(int instanceID, int line)
    {
   
        string path = AssetDatabase.GetAssetPath(EditorUtility.InstanceIDToObject(instanceID));
        string name = Application.dataPath + "/" + path.Replace("Assets/", "");


        if (name.EndsWith(".shader"))
        {
            System.Diagnostics.Process process = new System.Diagnostics.Process();
            System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
            startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
            startInfo.FileName = "C:/Program Files/Sublime Text 2/sublime_text.exe";
            startInfo.Arguments = name;
            process.StartInfo = startInfo;
            process.Start();
            return true;
        }
        // Debug.Log("Open Asset step: 2 (" + name + ")");
        return false; // we did not handle the open
    }
}



有兴趣的可以研究代码的意思吧,这个类也不需要放在Editor里面,随便找个地方扔就好了。
关键的是[OnOpenAsset]这玩意,我F12点开看了一下,后面的参数是执行顺序。

噢,还有一点,创建代码时给代码添加注释,就是上面的
//====================================
//描 述 :使用SubLime打开后缀为Shader的文件
//作 者 :  momo
//创建时间 :2018/05/15 15:57:46#  
//版 本 :  1.0
// ===============================================

三.创建代码时给代码添加注释
直接贴代码好了
[C#] 纯文本查看 复制代码
using System.IO;
using UnityEngine;




//本类还有众多回调方法
public class Test : UnityEditor.AssetModificationProcessor
{
    private static string annotationStr =
       "//====================================\r\n"
        + "//描 述 : \r\n"
        + "//作 者 :  \r\n"
        + "//创建时间 :#CreatTime#  \r\n"
        + "//版 本 :  \r\n"
        + "// ===============================================\r\n";

    private static void OnWillCreateAsset(string path)
    {      //方法必须为static
           //排除“.meta”的文件
        path = path.Replace(".meta", "");

        //如果是cs脚本,则进行添加注释处理
        if (path.EndsWith(".cs"))
        {
            //读取cs脚本的内容并太监到annotationStr后面
            annotationStr += File.ReadAllText(path);
            //把#CreateTime#替换成具体创建的时间
            annotationStr = annotationStr.Replace("#CreatTime#",
                System.DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"));
            //把内容重新写入脚本
            File.WriteAllText(path, annotationStr);
        }
        Debug.Log(path);
    }
}




找到这个类的时候,有很多回调方法,有兴趣的可以自己研究,比如用到的这个方法叫做OnWillCreateAsset(string path)
字面意思就是将要创建资源的时候调用,这里是通过判断后缀名来执行的,完全可以用于其他用途的对吧。
另外还可以读取PlayerSetting里面的项目名公司名等,但是那些信息在哪个类里面我找不到了,知道的可以留言嗯。

四.通过快捷键创建Prefab。

自从用Unity开始就知道Prefab这个玩意是个宝贝,一直以来创建它的方式也是直接把GameObject从Hierarchy拖到Project里面去。
直到我发现了它。
[C#] 纯文本查看 复制代码
using UnityEngine;
using System.Collections;
using UnityEditor;
using System.Text;
using System.IO;
using UnityEditor.SceneManagement;

public class TestFolder
{

    [MenuItem("try/makePrefab %w")]
    public static void Make()
    {

        GameObject obj = Selection.activeGameObject;
        string path = "Assets/test/testDir" + "/" + obj.name + ".prefab";
        // obj.transform.position = Vector3.forward;

        MakePrefab(path, obj);
    }

    public static void MakePrefab(string path, GameObject obj)
    {
        MakeParentDirExist(path);
        Object prefab = PrefabUtility.CreateEmptyPrefab(path);
        PrefabUtility.ReplacePrefab(obj, prefab, ReplacePrefabOptions.ConnectToPrefab);
    }

    public static string GetParentPath(string path, char splitFlag = '/')
    {
        string[] dirs = path.Split(splitFlag);
        StringBuilder str = new StringBuilder();
        for (int i = 0; i < dirs.Length - 1; ++i)
        {
            str.Append(dirs[i]).Append(splitFlag);
        }
        //cut down the last splitFlag
        string result = str.ToString();
        if (result.EndsWith(splitFlag.ToString()))
        {
            result = result.Substring(0, result.Length - 1);
        }
        return result;
    }

    public static string GetParentName(string path, char splitFlag = '/')
    {
        string[] dirs = path.Split(splitFlag);
        if (dirs.Length < 2)
        {
            return "";
        }
        else
        {
            return dirs[dirs.Length - 2];
        }
    }

    public static void MakeParentDirExist(string path)
    {
        string pDir = GetParentPath(path);

        if (!AssetDatabase.IsValidFolder(pDir))
        {
            MakeParentDirExist(pDir);
            AssetDatabase.CreateFolder(GetParentPath(pDir), GetParentName(path));
            AssetDatabase.Refresh();
        }
        else
        {
            return;
        }
    }


}


代码不难,因为每个方法的作用都很直观,递归也很好理解。
说点别的,[MenuItem("try/makePrefab %w")]这个方法很多地方都能用到。

%代表Ctrl &代表ALT #代表Shift 这是快捷键的用法,注意与标题隔开一个字符
[C#] 纯文本查看 复制代码
    //true   如果有同名方法的话,优先使用这个方法
    [MenuItem("GameObject/my delete", true, 11)]
    static bool MyDeleteValidate()
    {
        if (Selection.objects.Length > 0)
            return true;
        else
        {
           
            return false;
        }
    }

    [MenuItem("GameObject/my delete", false, 11)]
    static void Mydelete()
    {
        foreach (Object o in Selection.objects)
        {
            //GameObject.DestroyImmediate(o);
            Undo.DestroyObjectImmediate(o);//利用Undo进行的删除操作 是可以撤销的
        }
        //需要把删除操作注册到 操作记录里面
    }




这里面的注释也写得比较清楚了,当未选中物体时,菜单栏选项不可点击(my delete)。


当选中物体时,变为可点击。
后面的参数大家可以一个调为1000,一个调为1,看看效果,太难截图了。

里面还有一个Undo类,这玩意跟栈的道理大概差不多,我们写代码可以CTR + Z撤销,但是这里就不能,于是我们通过这个类创建的东西,或者删除东西,还有一些其他的操作可以F12看看,是可以通过CTR + Z来撤销的,具体我现在没有刚需,没深入研究。


五.类的本地化
这是我空闲下来之后准备研究的一个点,忘记从什么地方看到这东西了,当时兴致勃勃地浏览了一遍相关知识,趁着没忘光赶快记下来。


大致就是继承了这个ScirptableObject类之后就可以使用这个属性了,使用这个属性就可以在Project面板右键创建这么个玩意了。
暂时没研究,只是知道这东西用处大概跟json还有XML差不多,并且因为保存在本地了,数据不会丢失。
想要修改它可以通过常规的Resources类等 GlobleData globleData = Resources.Load<GlobleData>("Globle Data");


当初我还写了个SetDirty是干嘛的,大致就是通知Unity你修改数据,因为Unity默认会保存你修改的数据,但是在某两个地方不能(对,我忘记是哪里了),所以需要通知一下它。


参与人数 7鲜花 +14 收起 理由
crazycloud + 2 赞一个!
suiyuechangfeng + 2 神马都是浮云
kckbkckb2 + 2 很给力!
xanta + 2 很给力!
就比你帅一点 + 2 赞一个!
hsGuy929 + 2 很给力!
RyeCat + 2 很给力!

查看全部评分总评分 : 鲜花 +14

排名
5577
昨日变化

13

主题

89

帖子

748

积分

Rank: 9Rank: 9Rank: 9

UID
215257
好友
6
蛮牛币
1805
威望
0
注册时间
2017-3-29
在线时间
354 小时
最后登录
2019-4-18
沙发
楼主 2018-5-15 18:04:27 只看该作者
好像图都没加载出来,先下班回家再说
5熟悉之中
707/1000
排名
4640
昨日变化

5

主题

164

帖子

707

积分

Rank: 5Rank: 5

UID
252889
好友
2
蛮牛币
2330
威望
0
注册时间
2017-11-6
在线时间
223 小时
最后登录
2019-4-22
QQ
板凳
2018-5-16 08:46:36 只看该作者
3偶尔光临
215/300
排名
9775
昨日变化

0

主题

14

帖子

215

积分

Rank: 3Rank: 3Rank: 3

UID
28256
好友
0
蛮牛币
271
威望
0
注册时间
2014-6-5
在线时间
87 小时
最后登录
2018-9-4
地板
2018-5-16 09:32:01 只看该作者
这贴很有用,学习学习!感谢楼主分享
7日久生情
1584/5000
排名
1677
昨日变化

13

主题

213

帖子

1584

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
191997
好友
2
蛮牛币
178
威望
0
注册时间
2017-2-22
在线时间
594 小时
最后登录
2019-3-20
5#
2018-5-16 10:41:54 只看该作者
很强势,
5熟悉之中
614/1000
排名
5174
昨日变化

22

主题

151

帖子

614

积分

Rank: 5Rank: 5

UID
45756
好友
0
蛮牛币
584
威望
0
注册时间
2014-9-19
在线时间
163 小时
最后登录
2019-4-15
6#
2018-5-16 14:43:25 只看该作者
{:104:}{:104:}{:104:}{:104:}非常实用的代码知识
7日久生情
2042/5000
排名
1996
昨日变化

8

主题

790

帖子

2042

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
83438
好友
3
蛮牛币
17929
威望
0
注册时间
2015-3-23
在线时间
561 小时
最后登录
2019-4-15
7#
2018-5-16 17:33:01 只看该作者
学习 学习
7日久生情
2490/5000
排名
782
昨日变化

1

主题

699

帖子

2490

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
56496
好友
0
蛮牛币
7648
威望
0
注册时间
2014-11-19
在线时间
572 小时
最后登录
2019-4-22
8#
2018-5-17 09:14:19 只看该作者
营养丰富啊,只是排版很乱!
5熟悉之中
621/1000
排名
4032
昨日变化

1

主题

54

帖子

621

积分

Rank: 5Rank: 5

UID
245487
好友
0
蛮牛币
1371
威望
0
注册时间
2017-9-22
在线时间
200 小时
最后登录
2018-8-21
9#
2018-5-17 10:28:23 只看该作者
收获颇丰,感谢感谢
6蛮牛粉丝
1169/1500
排名
2333
昨日变化

1

主题

160

帖子

1169

积分

Rank: 6Rank: 6Rank: 6

UID
236305
好友
1
蛮牛币
1639
威望
0
注册时间
2017-8-7
在线时间
400 小时
最后登录
2019-4-22
10#
2018-5-17 10:40:02 只看该作者
强势 前来学习一下心得
5熟悉之中
651/1000
排名
9200
昨日变化

0

主题

424

帖子

651

积分

Rank: 5Rank: 5

UID
250036
好友
0
蛮牛币
1483
威望
0
注册时间
2017-10-21
在线时间
101 小时
最后登录
2019-4-22
11#
2018-5-17 10:46:44 只看该作者
emmmm,unity工具能实现的操作用代码来实现的目的是?新手不太清楚
排名
5577
昨日变化

13

主题

89

帖子

748

积分

Rank: 9Rank: 9Rank: 9

UID
215257
好友
6
蛮牛币
1805
威望
0
注册时间
2017-3-29
在线时间
354 小时
最后登录
2019-4-18
12#
楼主 2018-5-17 11:59:01 只看该作者
hello33 发表于 2018-5-17 10:46
emmmm,unity工具能实现的操作用代码来实现的目的是?新手不太清楚

请问你说的Unity工具是啥...指的Unity编辑器还是Unity插件,操作又是什么
排名
5577
昨日变化

13

主题

89

帖子

748

积分

Rank: 9Rank: 9Rank: 9

UID
215257
好友
6
蛮牛币
1805
威望
0
注册时间
2017-3-29
在线时间
354 小时
最后登录
2019-4-18
13#
楼主 2018-5-17 11:59:09 只看该作者
hello33 发表于 2018-5-17 10:46
emmmm,unity工具能实现的操作用代码来实现的目的是?新手不太清楚

请问你说的Unity工具是啥...指的Unity编辑器还是Unity插件,操作又是什么
排名
5577
昨日变化

13

主题

89

帖子

748

积分

Rank: 9Rank: 9Rank: 9

UID
215257
好友
6
蛮牛币
1805
威望
0
注册时间
2017-3-29
在线时间
354 小时
最后登录
2019-4-18
14#
楼主 2018-5-17 11:59:47 只看该作者
hsGuy929 发表于 2018-5-17 09:14
营养丰富啊,只是排版很乱!

谢谢,要下班了,所以写得很乱
5熟悉之中
874/1000
排名
5640
昨日变化

0

主题

448

帖子

874

积分

Rank: 5Rank: 5

UID
146677
好友
9
蛮牛币
2786
威望
0
注册时间
2016-4-25
在线时间
176 小时
最后登录
2019-3-21
QQ
15#
2018-5-17 18:57:01 只看该作者
Unity IDE使用过做好的觉得还是JetBrains Rider
您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

  • 您访问的页面找不回来了 2019-04-07
  • 五莲科技局以“三大”助力动能转换 2019-04-07
  • 匹夫有责之一百一十二—道义大义的博客—强国博客—人民网 2019-03-30
  • 守住青山不放松 护好绿水不辞难——在渝全国人大代表聚焦“共抓大保护、不搞大开发”专题调研记略 2019-03-28
  • 经营者要想“我心换你心”,就要未雨绸缪,让不诚信的诱惑少一点,如此才能在市场中生存下来。反过来说,承担不起亏损就关门歇业,是否也是一种不诚信呢? 2019-03-21
  • 追风上市公司“跌落神坛”-热门标签-华商网数码 2019-03-21
  • 文化艺术交易场所沙龙第一期活动在京顺利举行 2019-03-16
  • 看把你高兴的屁颠屁颠的,光有赞有什么用?我给你个货真价实的 [大红包]。 2019-03-16
  • 候选企业:中国石油呼和浩特石化公司 2019-02-22
  • 我国纳米核心技术取得重大突破 2019-02-22
  • 北京:端午节民俗地图  小枣粽——竹叶红枣糯糯情  2019-01-26
  • 机器人送快递将在西安试点 识别红绿灯还能“车让人” 2019-01-26
  • 首批限竞房正式入市 戳三大盘看详情! ——凤凰网房产北京 2018-12-09
  • 世界杯频爆冷门网友大呼“天台见”!警方:不要冲动,不要跳楼 2018-08-21
  • 始终如一的是:美国优先。 2018-08-21
  • 16| 972| 547| 575| 789| 602| 485| 773| 454| 791|