游戏蛮牛学习群(纯技术交流,不闲聊):959392658
福建体彩31选7开奖 手机端
开发者专栏

关注:2372

当前位置:福建体彩31选7开奖 技术专区 开发者专栏

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

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

福建省体彩31选7: [云枫] 一些杂乱的代码知识(一)

[复制链接]  [移动端链接]
排名
5611
昨日变化
2

福建体彩31选7开奖 www.jlh8.com.cn 12

主题

84

帖子

712

积分

Rank: 9Rank: 9Rank: 9

UID
215257
好友
4
蛮牛币
1710
威望
0
注册时间
2017-3-29
在线时间
336 小时
最后登录
2018-12-6
跳转到指定楼层
楼主
发表于 2018-5-15 18:03:13 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

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 很给力!

查看全部评分


排名
5611
昨日变化
2

12

主题

84

帖子

712

积分

Rank: 9Rank: 9Rank: 9

UID
215257
好友
4
蛮牛币
1710
威望
0
注册时间
2017-3-29
在线时间
336 小时
最后登录
2018-12-6
沙发
 楼主| 发表于 2018-5-15 18:04:27 | 只看该作者
好像图都没加载出来,先下班回家再说

5熟悉之中
568/1000
排名
5375
昨日变化
4

2

主题

147

帖子

568

积分

Rank: 5Rank: 5

UID
252889
好友
2
蛮牛币
1838
威望
0
注册时间
2017-11-6
在线时间
164 小时
最后登录
2018-12-4
QQ
板凳
发表于 2018-5-16 08:46:36 | 只看该作者

3偶尔光临
215/300
排名
9513
昨日变化
4

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日久生情
1580/5000
排名
1597
昨日变化
1

13

主题

213

帖子

1580

积分

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

UID
191997
好友
2
蛮牛币
144
威望
0
注册时间
2017-2-22
在线时间
590 小时
最后登录
2018-11-20
5#
发表于 2018-5-16 10:41:54 | 只看该作者
很强势,

5熟悉之中
581/1000
排名
5152
昨日变化

18

主题

144

帖子

581

积分

Rank: 5Rank: 5

UID
45756
好友
0
蛮牛币
603
威望
0
注册时间
2014-9-19
在线时间
151 小时
最后登录
2018-11-27
6#
发表于 2018-5-16 14:43:25 | 只看该作者
{:104:}{:104:}{:104:}{:104:}非常实用的代码知识

7日久生情
2000/5000
排名
1992
昨日变化

8

主题

787

帖子

2000

积分

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

UID
83438
好友
2
蛮牛币
2111
威望
0
注册时间
2015-3-23
在线时间
540 小时
最后登录
2018-12-10
7#
发表于 2018-5-16 17:33:01 | 只看该作者
学习 学习

7日久生情
2316/5000
排名
880
昨日变化
6

1

主题

670

帖子

2316

积分

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

UID
56496
好友
0
蛮牛币
6988
威望
0
注册时间
2014-11-19
在线时间
523 小时
最后登录
2018-12-12
8#
发表于 2018-5-17 09:14:19 | 只看该作者
营养丰富啊,只是排版很乱!

5熟悉之中
621/1000
排名
3885
昨日变化
4

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 | 只看该作者
收获颇丰,感谢感谢

5熟悉之中
948/1000
排名
2846
昨日变化
13

1

主题

142

帖子

948

积分

Rank: 5Rank: 5

UID
236305
好友
1
蛮牛币
1335
威望
0
注册时间
2017-8-7
在线时间
307 小时
最后登录
2018-12-12
10#
发表于 2018-5-17 10:40:02 | 只看该作者
强势 前来学习一下心得
[发帖际遇]: 一个袋子砸在了 SrMao_e432t 头上,SrMao_e432t 赚了 1 蛮牛币. 幸运榜 / 衰神榜

5熟悉之中
649/1000
排名
8951
昨日变化
5

0

主题

424

帖子

649

积分

Rank: 5Rank: 5

UID
250036
好友
0
蛮牛币
1495
威望
0
注册时间
2017-10-21
在线时间
99 小时
最后登录
2018-10-18
11#
发表于 2018-5-17 10:46:44 | 只看该作者
emmmm,unity工具能实现的操作用代码来实现的目的是?新手不太清楚

排名
5611
昨日变化
2

12

主题

84

帖子

712

积分

Rank: 9Rank: 9Rank: 9

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

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

排名
5611
昨日变化
2

12

主题

84

帖子

712

积分

Rank: 9Rank: 9Rank: 9

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

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

排名
5611
昨日变化
2

12

主题

84

帖子

712

积分

Rank: 9Rank: 9Rank: 9

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

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

5熟悉之中
849/1000
排名
5611
昨日变化
2

0

主题

438

帖子

849

积分

Rank: 5Rank: 5

UID
146677
好友
9
蛮牛币
2749
威望
0
注册时间
2016-4-25
在线时间
169 小时
最后登录
2018-12-10
QQ
15#
发表于 2018-5-17 18:57:01 | 只看该作者
Unity IDE使用过做好的觉得还是JetBrains Rider

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

本版积分规则

快速回复 福建体彩31选7开奖 返回列表
20| 387| 463| 284| 34| 615| 943| 734| 105| 587|