游戏蛮牛学习群(纯技术交流,不闲聊):539178957
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:2257

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

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

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

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

[复制链接]  [移动端链接]
排名
7230
昨日变化
65

12

主题

75

帖子

536

积分

Rank: 9Rank: 9Rank: 9

UID
215257
好友
4
蛮牛币
1456
威望
0
注册时间
2017-3-29
在线时间
263 小时
最后登录
2018-7-16

迈向小康

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

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

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

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

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

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

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

P6{B1)[UEISLQ7LQW`61Z)B.png
这次准备好好学了,然后问了群里大神用Sublime Text2这个IDE,网上百度就OK了。
然后跟着教程走,到这一步,我就懵逼了。

6BA@%JZ[TECW]N@P1TVOW.png
根本没有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进行的删除操作 是可以撤销的
        }
        //需要把删除操作注册到 操作记录里面
    }



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


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

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


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


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

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


评分

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

查看全部评分


回复

使用道具 举报

排名
7230
昨日变化
65

12

主题

75

帖子

536

积分

Rank: 9Rank: 9Rank: 9

UID
215257
好友
4
蛮牛币
1456
威望
0
注册时间
2017-3-29
在线时间
263 小时
最后登录
2018-7-16

迈向小康

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

回复 支持 反对

使用道具 举报

5熟悉之中
504/1000
排名
5626
昨日变化
1

2

主题

140

帖子

504

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

3偶尔光临
196/300
排名
9150
昨日变化
118

0

主题

9

帖子

196

积分

Rank: 3Rank: 3Rank: 3

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

回复 支持 反对

使用道具 举报

7日久生情
1572/5000
排名
1481
昨日变化
2

13

主题

208

帖子

1572

积分

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

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

回复

使用道具 举报

5熟悉之中
538/1000
排名
5197
昨日变化
38

18

主题

139

帖子

538

积分

Rank: 5Rank: 5

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

回复 支持 反对

使用道具 举报

7日久生情
1838/5000
排名
2149
昨日变化
7

8

主题

745

帖子

1838

积分

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

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

回复

使用道具 举报

7日久生情
1987/5000
排名
1124
昨日变化
2

1

主题

603

帖子

1987

积分

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

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

回复 支持 反对

使用道具 举报

5熟悉之中
541/1000
排名
4099
昨日变化
24

1

主题

49

帖子

541

积分

Rank: 5Rank: 5

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

回复 支持 反对

使用道具 举报

5熟悉之中
632/1000
排名
3970
昨日变化
26

1

主题

112

帖子

632

积分

Rank: 5Rank: 5

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

回复 支持 反对

使用道具 举报

5熟悉之中
641/1000
排名
8607
昨日变化
84

0

主题

423

帖子

641

积分

Rank: 5Rank: 5

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

回复 支持 反对

使用道具 举报

排名
7230
昨日变化
65

12

主题

75

帖子

536

积分

Rank: 9Rank: 9Rank: 9

UID
215257
好友
4
蛮牛币
1456
威望
0
注册时间
2017-3-29
在线时间
263 小时
最后登录
2018-7-16

迈向小康

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

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

回复 支持 反对

使用道具 举报

排名
7230
昨日变化
65

12

主题

75

帖子

536

积分

Rank: 9Rank: 9Rank: 9

UID
215257
好友
4
蛮牛币
1456
威望
0
注册时间
2017-3-29
在线时间
263 小时
最后登录
2018-7-16

迈向小康

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

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

回复 支持 反对

使用道具 举报

排名
7230
昨日变化
65

12

主题

75

帖子

536

积分

Rank: 9Rank: 9Rank: 9

UID
215257
好友
4
蛮牛币
1456
威望
0
注册时间
2017-3-29
在线时间
263 小时
最后登录
2018-7-16

迈向小康

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

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

回复 支持 反对

使用道具 举报

5熟悉之中
823/1000
排名
5379
昨日变化
6

0

主题

426

帖子

823

积分

Rank: 5Rank: 5

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

回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

关闭

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

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