开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:2213

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 1088|回复: 28

[云枫] 一些杂乱的代码知识(一)

[复制链接]  [移动端链接]
排名
10081
昨日变化
127

12

主题

54

帖子

343

积分

Rank: 9Rank: 9Rank: 9

UID
215257
好友
2
蛮牛币
1284
威望
0
注册时间
2017-3-29
在线时间
169 小时
最后登录
2018-5-26

迈向小康

发表于 2018-5-15 18:03:13 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 m2675 于 2018-5-22 16:34 编辑

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



一.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默认会保存你修改的数据,但是在某两个地方不能(对,我忘记是哪里了),所以需要通知一下它。


评分

参与人数 3鲜花 +6 收起 理由
就比你帅一点 + 2 赞一个!
hsGuy929 + 2 很给力!
RyeCat + 2 很给力!

查看全部评分


回复

使用道具 举报

排名
10081
昨日变化
127

12

主题

54

帖子

343

积分

Rank: 9Rank: 9Rank: 9

UID
215257
好友
2
蛮牛币
1284
威望
0
注册时间
2017-3-29
在线时间
169 小时
最后登录
2018-5-26

迈向小康

 楼主| 发表于 2018-5-15 18:04:27 | 显示全部楼层
好像图都没加载出来,先下班回家再说

回复 支持 反对

使用道具 举报

4四处流浪
366/500
排名
6914
昨日变化
1

2

主题

94

帖子

366

积分

Rank: 4

UID
252889
好友
1
蛮牛币
1154
威望
0
注册时间
2017-11-6
在线时间
106 小时
最后登录
2018-5-24
QQ
发表于 2018-5-16 08:46:36 | 显示全部楼层

回复

使用道具 举报

2初来乍到
134/150
排名
11349
昨日变化
2

0

主题

9

帖子

134

积分

Rank: 2Rank: 2

UID
28256
好友
0
蛮牛币
177
威望
0
注册时间
2014-6-5
在线时间
51 小时
最后登录
2018-5-22
发表于 2018-5-16 09:32:01 | 显示全部楼层
这贴很有用,学习学习!感谢楼主分享

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1464/1500
排名
1610
昨日变化
5

13

主题

199

帖子

1464

积分

Rank: 6Rank: 6Rank: 6

UID
191997
好友
2
蛮牛币
4750
威望
0
注册时间
2017-2-22
在线时间
536 小时
最后登录
2018-5-26
发表于 2018-5-16 10:41:54 | 显示全部楼层
很强势,

回复

使用道具 举报

4四处流浪
443/500
排名
6078
昨日变化
4

17

主题

128

帖子

443

积分

Rank: 4

UID
45756
好友
0
蛮牛币
449
威望
0
注册时间
2014-9-19
在线时间
104 小时
最后登录
2018-5-25
发表于 2018-5-16 14:43:25 | 显示全部楼层
{:104:}{:104:}{:104:}{:104:}非常实用的代码知识

回复 支持 反对

使用道具 举报

7日久生情
1775/5000
排名
2255
昨日变化

8

主题

737

帖子

1775

积分

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

UID
83438
好友
2
蛮牛币
1996
威望
0
注册时间
2015-3-23
在线时间
472 小时
最后登录
2018-5-23
发表于 2018-5-16 17:33:01 | 显示全部楼层
学习 学习

回复

使用道具 举报

7日久生情
1873/5000
排名
1202
昨日变化
1

1

主题

571

帖子

1873

积分

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

UID
56496
好友
0
蛮牛币
5349
威望
0
注册时间
2014-11-19
在线时间
423 小时
最后登录
2018-5-17
发表于 2018-5-17 09:14:19 | 显示全部楼层
营养丰富啊,只是排版很乱!

回复 支持 反对

使用道具 举报

4四处流浪
427/500
排名
4886
昨日变化
1

1

主题

41

帖子

427

积分

Rank: 4

UID
245487
好友
0
蛮牛币
672
威望
0
注册时间
2017-9-22
在线时间
129 小时
最后登录
2018-5-25
发表于 2018-5-17 10:28:23 | 显示全部楼层
收获颇丰,感谢感谢

回复 支持 反对

使用道具 举报

5熟悉之中
520/1000
排名
4713
昨日变化
1

1

主题

93

帖子

520

积分

Rank: 5Rank: 5

UID
236305
好友
0
蛮牛币
704
威望
0
注册时间
2017-8-7
在线时间
160 小时
最后登录
2018-5-25
发表于 2018-5-17 10:40:02 | 显示全部楼层
强势 前来学习一下心得
[发帖际遇]: 一个袋子砸在了 SrMao_e432t 头上,SrMao_e432t 赚了 1 蛮牛币. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

3偶尔光临
219/300
排名
16246
昨日变化
422

0

主题

149

帖子

219

积分

Rank: 3Rank: 3Rank: 3

UID
250036
好友
0
蛮牛币
485
威望
0
注册时间
2017-10-21
在线时间
34 小时
最后登录
2018-5-26
发表于 2018-5-17 10:46:44 | 显示全部楼层
emmmm,unity工具能实现的操作用代码来实现的目的是?新手不太清楚

回复 支持 反对

使用道具 举报

排名
10081
昨日变化
127

12

主题

54

帖子

343

积分

Rank: 9Rank: 9Rank: 9

UID
215257
好友
2
蛮牛币
1284
威望
0
注册时间
2017-3-29
在线时间
169 小时
最后登录
2018-5-26

迈向小康

 楼主| 发表于 2018-5-17 11:59:01 | 显示全部楼层
hello33 发表于 2018-5-17 10:46
emmmm,unity工具能实现的操作用代码来实现的目的是?新手不太清楚

请问你说的Unity工具是啥...指的Unity编辑器还是Unity插件,操作又是什么

回复 支持 反对

使用道具 举报

排名
10081
昨日变化
127

12

主题

54

帖子

343

积分

Rank: 9Rank: 9Rank: 9

UID
215257
好友
2
蛮牛币
1284
威望
0
注册时间
2017-3-29
在线时间
169 小时
最后登录
2018-5-26

迈向小康

 楼主| 发表于 2018-5-17 11:59:09 | 显示全部楼层
hello33 发表于 2018-5-17 10:46
emmmm,unity工具能实现的操作用代码来实现的目的是?新手不太清楚

请问你说的Unity工具是啥...指的Unity编辑器还是Unity插件,操作又是什么

回复 支持 反对

使用道具 举报

排名
10081
昨日变化
127

12

主题

54

帖子

343

积分

Rank: 9Rank: 9Rank: 9

UID
215257
好友
2
蛮牛币
1284
威望
0
注册时间
2017-3-29
在线时间
169 小时
最后登录
2018-5-26

迈向小康

 楼主| 发表于 2018-5-17 11:59:47 | 显示全部楼层
hsGuy929 发表于 2018-5-17 09:14
营养丰富啊,只是排版很乱!

谢谢,要下班了,所以写得很乱

回复 支持 反对

使用道具 举报

5熟悉之中
763/1000
排名
5744
昨日变化

0

主题

403

帖子

763

积分

Rank: 5Rank: 5

UID
146677
好友
9
蛮牛币
2571
威望
0
注册时间
2016-4-25
在线时间
152 小时
最后登录
2018-5-19
QQ
发表于 2018-5-17 18:57:01 | 显示全部楼层
Unity IDE使用过做好的觉得还是JetBrains Rider

回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

关闭

站长推荐 上一条 /1 下一条

快速回复 返回顶部 返回列表