unity3d文件转化成moc_unity3d打不开unity3d文件 - CSDN
  • Qt 手动生成moc 文件

    千次阅读 2015-11-21 12:19:55
    今天在我的一个Qt程序中新添加了一个菜单项和对应的signal和slot之后,编译运行发现出现这样的错误: Object::connect No Such Slot………………….. 但是以前定义的signal和slot都能够正常工作。...

    今天在我的一个Qt程序中新添加了一个菜单项和对应的signal和slot之后,编译运行发现出现这样的错误:
    Object::connect No Such Slot…………………..
    但是以前定义的signal和slot都能够正常工作。而我把这个菜单项对应的signal与以前定义的slot进行连接,也能够正常运行。
    那为什么新添加的slot就不可以正常工作呢?

    Google搜索了一下,可能导致这种错误的原因有一下几点:
    1、查看类声明中有没有Q_OBJECT
    要使用slot的类的声明中必须包含Q_OBJECT

    2、我声明的函数要添加声明。比如:

    private slots:  
        void open();  
        void toggleAniamting();  
        void toggleAutoPlay();  
        void toggleShowFullScreen();  
        void about();  
    private slots:  
        void open();  
        void toggleAniamting();  
        void toggleAutoPlay();  
        void toggleShowFullScreen();  
        void about();  

    3、那就是要重新生成moc_XXX.cpp文件。
    我想起来了,我的VS和Qt配置不知道出了什么问题,moc不能被自动调用,必须手动生成这个moc文件。
    凡是存在由Q_OBJECT标示过的class的.h文件,都会由moc生成一个相应的文件。
    手动生成moc_XXX.cpp文件的方法:
    首先删除原来的moc_XXX.cpp文件。
    右键单击要生成moc文件的.h文件,点击属性->自定义生成步骤->常规,出现如下界面:
    这里写图片描述
    在命令行、输出和附加依赖项里面填上相应的内容。
    然后右键单击这个.h文件,点击“编译”,便可生成对应的moc文件。
    然后将生成的moc文件添加到源文件中。
    重新编译运行工程文件即可。

    展开全文
  • 如何对Unity工程进行加密

    千次阅读 2017-09-30 12:26:35
     最近在发布Unity工程时要考虑给Unity加密的问题,但有关此类的文章很少,多数人推荐使用C#中的System.Management类实现,虽然Unity3d支持.net3.5架构,但是并不是所有功能都能支持,System.Management类就是其中一...
    如何对unity工程进行加密

        最近在发布Unity工程时要考虑给Unity加密的问题,但有关此类的文章很少,多数人推荐使用C#中的System.Management类实现,虽然Unity3d支持.net3.5架构,但是并不是所有功能都能支持,System.Management类就是其中一个,该类能在VS中很好运行,但在Unity框架中并不支持,因此,我在加密过程中绕过System.Management管理类,先通过C++编程获取ProcessorID,然后再通过C#中System.Security.Cryptography加密算法类进行加密解密。经过一番周折,终于测试成功,这里分享给大家。

    第一步:生成License文件


    1. 制作简单的生成License文件的Winform界面


    Liscense生成界面

    2. 编写License文件生成器代码


    //-----------------------------------------
    //
    //      CuteEditorLic V1.0
    //
    //-----------------------------------------
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;
    using System.Security.Cryptography;
    using System.Diagnostics;
    using System.Management;
    using System.Globalization;
    
    namespace CuteEditorLic
    {
        public partial class 许可证文件生成器 : Form
        {
            private string key = "alskdfsakjsdikfhkjgfhjmvnnxfksajkwke135466dvfdsgjkfdhgskjsagbbkhfdgn";
            private string iv = "qjhsqjhwencgfuyuyggkxgzzmgfmhgjhkjhkmjfjhfnsks4464fsdgffdhghgsdf";
            public 许可证文件生成器()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
            }
    
            /// <summary>
            /// 输出Lic授权文件
            /// </summary>
            /// <param name="FilePath">输出文件路径</param>       
           
            private string encrption(string input, string key, string iv)
            {
                MemoryStream msEncrypt = null;//读写内存
                RijndaelManaged aesAlg = null;//加密算法类
    
                string sresult = string.Empty;
    
                try
                {
                    byte[] keys = System.Text.Encoding.UTF8.GetBytes(key);
                    byte[] ivs = System.Text.Encoding.UTF8.GetBytes(iv);
                    //byte[] keys = new byte[] { 70, 0x35, 50, 0x42, 0x31, 0x38, 0x36, 70 };
                    //byte[] ivs = new byte[] { 70, 0x35, 50, 0x42, 0x31, 0x38, 0x36, 70 };
                    aesAlg = new RijndaelManaged();//加密算法类实例化
    
                    aesAlg.Key = keys;
                    aesAlg.IV = ivs;
    
                    ICryptoTransform ict = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);//加密转换接口类
                    msEncrypt = new MemoryStream();//读写内存类实例化
    
                    using (CryptoStream cts = new CryptoStream(msEncrypt, ict, CryptoStreamMode.Write))
                    {
                        using (StreamWriter sw = new StreamWriter(cts))
                        {
                            sw.Write(input);
                        }
                    }
    
                }
                finally
                {
                    if (aesAlg != null)
                    {
                        //aesAlg.Dispose();
                        aesAlg.Clear();
                    }
                }
    
                if (msEncrypt != null)
                {
                    byte[] content = msEncrypt.ToArray();
    
                    sresult = Convert.ToBase64String(content);
                }
    
                return sresult;
            }
    
            private string decrption(string input, string key, string iv)
            {
                string sresult = string.Empty;
    
                byte[] keys = System.Text.Encoding.UTF8.GetBytes(key);
                byte[] ivs = System.Text.Encoding.UTF8.GetBytes(iv);
                //byte[] keys = new byte[] { 70, 0x35, 50, 0x42, 0x31, 0x38, 0x36, 70 };
                //byte[] ivs = new byte[] { 70, 0x35, 50, 0x42, 0x31, 0x38, 0x36, 70 };
    
                byte[] inputbytes = Convert.FromBase64String(input);
    
                RijndaelManaged rm = null;
    
                try
                {
                    rm = new RijndaelManaged();
                    rm.Key = keys;
                    rm.IV = ivs;
    
                    ICryptoTransform ict = rm.CreateDecryptor(rm.Key, rm.IV);
    
                    using (MemoryStream ms = new MemoryStream(inputbytes))
                    {
                        using (CryptoStream cs = new CryptoStream(ms, ict, CryptoStreamMode.Read))
                        {
                            using (StreamReader sr = new StreamReader(cs))
                            {
                                sresult = sr.ReadToEnd();
                            }
                        }
                    }
    
                }
                finally
                {
                    if (rm != null)
                    {
                        //rm.Dispose();
                        rm.Clear();
                    }
                }
    
                return sresult;
            }
    
    
            private void button1_Click(object sender, EventArgs e)
            {
                System.Management.ManagementClass mc = new ManagementClass("win32_processor");
                ManagementObjectCollection moc = mc.GetInstances();
                String processorid = "";
                foreach (ManagementObject mo in moc)
                {
                    processorid = mo["processorid"].ToString();
                    //MessageBox.Show(mo["processorid"].ToString());
                }
                this.textBox1.Text = processorid;
                string text = encrption(this.textBox1.Text, key.Substring(0, 32), iv.Substring(0, 16));
                this.textBox2.Text = text;
                using (FileStream fs = new FileStream("cuteeditor.lic", FileMode.Create, FileAccess.Write, FileShare.None))
                {
    
                    using (StreamWriter sw = new StreamWriter(fs))
                    {
                        // sw.Write("None;zh-cn;None;8H489467LS631834L;CuteEditor.Editor for asp.net is licensed.;1.6;5;51aspx.com;125.76.229.233;09/09/2099");
                        sw.Write(text);
                    }
    
                    Console.ReadLine();
    
                }
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                System.Management.ManagementClass mc = new ManagementClass("win32_processor");
                ManagementObjectCollection moc = mc.GetInstances();
                string processorid = "";
                string testext = "";
                foreach (ManagementObject mo in moc)
                {
                    processorid = mo["processorid"].ToString();
                    //MessageBox.Show(mo["processorid"].ToString());
               
               
                using (FileStream fs = new FileStream("cuteeditor.lic", FileMode.Open, FileAccess.Read, FileShare.None))
                {
    
                    using (StreamReader sr = new StreamReader(fs))
                    {
                        // sw.Write("None;zh-cn;None;8H489467LS631834L;CuteEditor.Editor for asp.net is licensed.;1.6;5;51aspx.com;125.76.229.233;09/09/2099");
                        testext = sr.ReadToEnd();
    
                    }
    
                    Console.ReadLine();
    
                }
                string text = decrption(testext, key.Substring(0, 32), iv.Substring(0, 16));
                this.textBox3.Text = text;
                if (text == processorid)
                {
                    MessageBox.Show("许可证文件正确");
                }
                }
            }
    
            private void Form1_Load_1(object sender, EventArgs e)
            {
                
            }
    
            private void button7_Click(object sender, EventArgs e)
            {
                string text = encrption(this.textBox4.Text, key.Substring(0, 32), iv.Substring(0, 16));
                this.textBox5.Text = text;
                DateTime date01 = dateTimePicker1.Value;
                DateTime date02 = dateTimePicker2.Value;
                string date1 = date01.ToString("d");
                string date2 = date02.ToString("d");
                string date1changed = encrption(date1, key.Substring(0, 32), iv.Substring(0, 16));
                string date2changed = encrption(date2, key.Substring(0, 32), iv.Substring(0, 16));
                
                System.DateTime currentTime=new System.DateTime();
                currentTime = System.DateTime.Now;
                if (IsInTimeInterval(currentTime, date01, date02)==true)
               {
                   MessageBox.Show("在授权期限内");
                }
                else
                   MessageBox.Show("不在授权期限内");
                //MessageBox.Show(date1);
                using (FileStream fs = new FileStream("License.lic", FileMode.Create, FileAccess.Write, FileShare.None))
                {
    
                    using (StreamWriter sw = new StreamWriter(fs))
                    {
                        // sw.Write("None;zh-cn;None;8H489467LS631834L;CuteEditor.Editor for asp.net is licensed.;1.6;5;51aspx.com;125.76.229.233;09/09/2099");
                        sw.WriteLine("Copyright (c) [本软件授权使用期限:"+date1+ "--" + date2 + "] [本软件由XXXX有限公司开发]");
                        sw.WriteLine("XXXX 软件许可协议(OEM/IHV/ISV 分销和单个用户)");
                        sw.WriteLine("重要通知 - 在复制、安装或使用之前,请先仔细阅读。");
                        sw.WriteLine("只有在仔细阅读下面的条款之后,方可使用或装载本软件及相关材料(总称为“软件”)。装载或使用本“软件”,即表明您同意本“协议”的条款。如果您不同意本“协议”的条款,请不要安装或使用本“软件”。");
                        sw.WriteLine("此外,还请注意:");
                        sw.WriteLine("* 如果您是原始设备制造商 (OEM)、独立硬件销售商 (IHV),或独立软件供应商 (ISV),本“许可协议”的所有内容对您适用。");
                        sw.WriteLine("* 如果您是最终用户,则只有附件一,即“XXXX 软件许可协议”对您适用。");
                        sw.WriteLine("对于 OEM、IHV 和 ISV:");
                        sw.WriteLine("许可:这一“软件”仅许可用来与 XXXX 组件产品结合使用。本“协议”不授予将此“软件”和其它非 XXXX 组件产品结合使用的许可。受本“协议”条款的约束,XXXX 公司据其版权授予您下述非专有、不可转让、全球性和完全付清的许可:");
                        sw.WriteLine("1. 为您本身的开发和维护目的而内部使用、改动和复制“软件”;并且");
                        sw.WriteLine("2. 更改、复制并向您的最终用户分销“软件”,包括本“软件”的衍生产品,条件是,这种分发必须按照一项许可协议进行,其条款至少要象下面所附的附件一,即 XXXX 公司最终、单个用户“许可协议”中所包含的条款一样严格,以及");
                        sw.WriteLine("3. 更改、复制和分销随“软件”所附的最终用户说明文件,但只能和“软件”一起分发。");
                        sw.WriteLine("");
                        sw.WriteLine("如果您不是装有本“软件”的计算机系统或软件程序的最终制造商或销售商,那么,您可以转让本“软件”的一份副本,包括本“软件”的衍生产品(和有关的最终用户说明文件)给您的接收者,按本“协议”的条款供其使用,条件是,该接收者必须同意完全接受本“协议”条款的约束。您将不得转让、分让或租让许可或以任何其它方式将本“软件”转移或透露给任何第三者。您将不得分解编码、拆散本“软件”或对其进行逆向工程设计。");
                        sw.WriteLine("除本“协议”中明确规定者以外,没有通过任何直接的、隐含的、推理的、禁止反悔的或其它方式授予贵方任何许可或权利。XXXX 公司将有权检查或经由独立审计人检查贵方的有关记录,以证实贵方是否遵守本“协议”的条款。");
                        sw.WriteLine("保密:如果贵方希望由第三方咨询机构或转包人(“承包人”)代贵方从事一些需要接触和使用本“软件”的工作,贵方必须从承包人处获得书面保密协议,其条款和接触使用本“软件”所涉及的责任至少应和本“协议”的条款一样严格,并规定承包人不得分发本“软件”或将之用于任何其它目的。除此之外,贵方不得透露签署过本“协议”或其中的条款,未经 XXXX 公司的书面同意,也不得在任何出版物、广告或其它公告中使用 XXXX 公司的名称。贵方没有任何权利使用 XXXX 公司的任何商标或标识。");
                        sw.WriteLine("软件的所有权和版权:本“软件”所有副本的所有权归 XXXX 公司或其供应商所有。本“软件”具有版权,并受到美国和其它国家法律以及国际条约条款的保护。您不得从本“软件”上删除任何版权通知。XXXX 公司可随时改变本“软件”或其中述及的项目,恕不另行通知,但是,XXXX 公司没有义务支持本“软件”或对其进行更新。除非另有明确规定,XXXX 公司未以任何明确的或隐含的方式授予贵方任何其拥有的专利、版权、商标或其它知识产权方面的权利。只有在接收者同意完全接受这些条款的约束且贵方不保留“软件”副本的前提下,您才能转让本“软件”。");
                        sw.WriteLine("有限的媒体品质保证:如果本“软件”由 XXXX 公司以实物媒体递交,XXXX 公司保证自该媒体交递之日起九十 (90) 天内没有材料和实物上的缺陷。如果出现这样的缺陷,请将有缺陷的媒体退还 XXXX 公司进行更换,XXXX 公司也可能选择以另外的途径递交该“软件”。");
                        sw.WriteLine("不包括任何其它保证:除上述保证之外,本“软件”是按其“现状”而提供的,没有任何其它明确或隐含的保证,包括适销性、非侵权性或适用于某一特定用途的保证。XXXX 公司对本“软件”中包括的任何信息、文字、图形、链接或其它项目的精确性或完整性不作担保,也不承担责任。");
                        sw.WriteLine("有限责任:对于因使用或无法使用本“软件”所造成的任何损失(包括但并不限于利润损失、业务中断或信息丢失等),无论在何种情况下,即使 XXXX 公司已被事先通知可能会出现这样的损失,XXXX 公司及其供应商均不承担任何责任。有些法律管区禁止排除或限制隐含保证或后果性、事故性损失的责任,因此,上述限制可能对您不适用。随法律管区的不同,您还可能拥有其它法定权利。");
                        sw.WriteLine("本协议的终止:如果您违反“协议”的条款,XXXX 公司则可随时终止本“协议”。协议终止时,您应该立即销毁本“软件”或将“软件”的所有副本退还 XXXX 公司。");
                        sw.WriteLine("适用的法律:因本“协议”而产生的索赔将接受加利福尼亚州法律的管辖,但不受其法律冲突原则的约束。本“协议”将不受《联合国国际货物销售合同公约》的约束。您不得违反适用的出口法规而将本“软件”出口国外。XXXX 公司不承担任何其它协议的责任,除非这些协议为书面协议并经过 XXXX 公司的授权代表签署。");
                        sw.WriteLine("政府机构有限的权利:本“软件”是以“有限的权利”而提供的。政府机构使用、复制或透露本“软件”应受到 FAR52.227-14 和 DFAR252.227-7013 及其承续法的限制。政府机构使用本“软件”即表明其承认 XXXX 公司对“软件”的所有权权利。承包商或制造商为:XXXX Corporation, 2200 Mission College Blvd., Santa Clara, CA 95052 USA。");
                        sw.WriteLine("");
                        sw.WriteLine("附件一");
                        sw.WriteLine("XXXX 软件许可协议(最终、单个用户)");
                        sw.WriteLine("重要通知 - 在复制、安装或使用之前,请先仔细阅读。");
                        sw.WriteLine("只有在仔细阅读下面的条款之后,方可使用或装载本软件及相关材料(总称为“软件”)。装载或使用本“软件”,即表明您同意本“协议”的条款。如果您不同意本“协议”的条款,请不要安装或使用本“软件”。");
                        sw.WriteLine("许可:您可将本“软件”复制到一台计算机上供非商业性的个人使用,并可复制一份本“软件”的备份。上述使用和备份受以下条款的约束:");
                        sw.WriteLine("1. 这一“软件”仅许可用来与 XXXX 组件产品结合使用。本“协议”不授予将此“软件”和其它非 XXXX 组件产品结合使用的许可。");
                        sw.WriteLine("2. 除本“协议”中规定者之外,您不得复制、改变、出租、出售、分发或转让本“软件”的任何部分,您并且同意防止他人未经授权而复制本“软件”。");
                        sw.WriteLine("3. 您不得分解编码、拆散本“软件”或对其进行逆向工程设计。");
                        sw.WriteLine("4. 您不得分让或允许同时有一个以上的用户使用本“软件”。");
                        sw.WriteLine("5. 本“软件”可能含有第三方供应商的软件或其它财产,其中有些可能已经在随附的“license.txt”或其它文本或文件中注明并根据这些文件而获得许可。");
                        sw.WriteLine("软件的所有权和版权:本“软件”所有副本的所有权归 XXXX 公司或其供应商所有。本“软件”具有版权,并受到美国和其它国家法律以及国际条约条款的保护。您不得从本“软件”上删除任何版权通知。XXXX 公司可随时改变本“软件”或其中述及的项目,恕不另行通知,但是,XXXX 公司没有义务支持本“软件”或对其进行更新。除非另有明确规定,XXXX 公司未以任何明确的或隐含的方式授予贵方任何其拥有的专利、版权、商标或其它知识产权方面的权利。只有在接收者同意完全接受这些条款的约束且贵方不保留“软件”副本的前提下,您才能转让本“软件”。");
                        sw.WriteLine("有限的媒体品质保证:如果本“软件”由 XXXX 公司以实物媒体交递,XXXX 公司保证自该媒体交递之日起九十 (90) 天内没有材料和实物上的缺陷。如果出现这样的缺陷,请将有缺陷的媒体退还 XXXX 公司进行更换,XXXX 公司也可能选择以另外的途径交递该“软件”。");
                        sw.WriteLine("不包括任何其它保证:除上述保证之外,本“软件”是按其“现状”而提供的,没有任何其它明确或隐含的保证,包括适销性、非侵权性或适用于某一特定用途的保证。XXXX 公司对本“软件”中包括的任何信息、文字、图形、链接或其它项目的精确性或完整性不作担保,也不承担责任。");
                        sw.WriteLine("有限责任:对于因使用或无法使用本“软件”所造成的任何损失(包括但并不限于利润损失、业务中断或信息丢失等),无论在何种情况下,即使 XXXX 公司已被事先通知可能会出现这样的损失,XXXX 公司及其供应商均不承担任何责任。有些法律管区禁止排除或限制隐含保证或后果性、事故性损失的责任,因此,上述限制可能对您不适用。随法律管区的不同,您还可能拥有其它法定权利。");
                        sw.WriteLine("本协议的终止:如果您违反本“协议”的条款,XXXX 公司则可随时终止本“协议”。“协议”终止时,您应该立即销毁本“软件”或将“软件”的所有副本退还 XXXX 公司。");
                        sw.WriteLine("适用的法律:因本“协议”而产生的索赔将中华人民共和国法律的管辖,但不受其法律冲突原则的约束。本“协议”将不受《联合国国际货物销售合同公约》的约束。您不得违反适用的出口法规而将本“软件”出口国外。XXXX 公司不承担任何其它协议的责任,除非这些协议为书面协议并经过 XXXX 公司的授权代表签署。");
                        sw.WriteLine("政府机构有限的权利:本“软件”是以“有限的权利”而提供的。政府机构使用、复制或透露本“软件”受到 FAR52.227-14 和 DFAR252.227-7013 及其承续法的限制。政府机构使用本“软件”即表明其承认 XXXX 公司对“软件”的所有权权利。承包商或制造商为:XXXX Corporation, 2200 Mission College Blvd., Santa Clara, CA 95052 USA。SLAOEMISV1/RBK/01-21-00");
                        sw.WriteLine("INCREMENT jackDataManagerbase ugslmd 7.0 15caugc2013 100 SUPERSEDE");
                        sw.WriteLine("DUPDataManagerGROUP=UHD ISSUED=10caprc2013 ck=197 SIGN=13E6 6CA8 B322");
                        sw.WriteLine("vwViht2lF5ylrm86DcwjI2bO/T7msUGMdslcgEH+EqY=cMKidern7PkegIelOLyYycxcA");
                        sw.WriteLine("");
                        sw.WriteLine(date1changed);
                        sw.WriteLine("");
                        sw.WriteLine(date2changed);
                        sw.WriteLine("0CED 1E9E 40C4 F4C5 11EF 2257 024B 2F89 F32F C5E0 A8B5");
                        sw.WriteLine("404E F48C A0E0");
                        sw.WriteLine("INCREMENT jackDataManagermocap ugslmd 7.0 15caugc2013 100 SUPERSEDE");
                        sw.WriteLine("DUPDataManagerGROUP=UHD ISSUED=10caprc2013 ck=213 SIGN=0E14 0B08 72EE");
                        sw.WriteLine("vwVihs2oF6ylpm8mDcwAI2bO/T7qsUGMdGupgEH+EvY=cqGcMKlk3gvcOIlOLyllYycA");
                        sw.WriteLine("");
                        sw.WriteLine(date1changed);
                        sw.WriteLine("");
                        sw.WriteLine(date2changed);
                        sw.WriteLine("17C0 A842 8C45 589D 0DFE 4AD5 BC98 5477 6119 14BE 44A6 43BC");
                        sw.WriteLine("F203 A4D9 E7B8");
                        sw.WriteLine("INCREMENT jackDataManageropt ugslmd 7.0 15caugc2013 100 SUPERSEDE DUPDataManagerGROUP=UHD");
                        sw.WriteLine("ISSUED=10caprc2013 ck=153 SIGN=1A92 02DD 4141 8368 E567 8A7F");
                        sw.WriteLine("vwVtht2oF5ydrmsmDcwAj2bO/T7qbUGMdGuqgEH+EgY=7PH7k3OIfhlOjhdfPLyYycA");
                        sw.WriteLine("");
                        sw.WriteLine(date1changed);
                        sw.WriteLine("");
                        sw.WriteLine(date2changed);
                        sw.WriteLine("1126 FC56 F296 8EA7 E581 3F14 9010 A358 842F A95C DF78 1F41");
                        sw.WriteLine("INCREMENT jackDataManagertat ugslmd 7.0 15caugc2013 100 SUPERSEDE DUPDataManagerGROUP=UHD");
                        sw.WriteLine("ISSUED=10caprc2013 ck=246 SIGN=0530 5C25 E534 748D 8C6D 18B4");
                        sw.WriteLine(text+"7PH7k3OI46lOjhdffsPLyYycA");
                        sw.WriteLine("");
                        sw.WriteLine(date1changed);
                        sw.WriteLine("");
                        sw.WriteLine(date2changed);
                        sw.WriteLine("F771 BEE5 2B9B B401 9B68 7CAD AC16 748F 366F 5536 E8BF 7067");
                        sw.WriteLine("INCREMENT jackDataManagertoolkit ugslmd 7.0 15caugc2013 100 SUPERSEDE");
                        sw.WriteLine("DUPDataManagerGROUP=UHD ISSUED=10caprc2013 ck=146 SIGN=02F5 0DD5 E558");
                        sw.WriteLine("vwViht0oF5ylrw8mDcwAI2zO/T7fsUHMdGuzgEH-EqY=l7k3OIlshhOnmjkgPLyYycA");
                        sw.WriteLine("");
                        sw.WriteLine(date1changed);
                        sw.WriteLine("");
                        sw.WriteLine(date2changed);
                        sw.WriteLine("1F86 4E64 35B5 0A4E 597E 78B0 0A28 A0C9 644B E5D8 1F80 94FA");
                        sw.WriteLine("DFFA A6AE BEF4");
                        sw.WriteLine("FEATURE serverDataManagerid ugslmd 7.0 permanent 1 VENDORDataManagerSTRING=IN04102013 c");
                        sw.WriteLine("SIEMENS PLM SOFTWA userDataManagerinfo=3TLFWAM3CP ISSUER=SIEMENS ck=175");
                        sw.WriteLine("SIGN=116C 3E2A 6874 5E61 97B9 9942 5EED 2661 A20C 690E F60D");
                        sw.WriteLine("F803 C42E 47E9 D6E1 0005 7F17 3AB3 5EA7 68FD 2D8C 81AD 171D");
                    }
    
                    Console.ReadLine();
    
                }
            }
    
            private void button6_Click(object sender, EventArgs e)
            {
                System.Management.ManagementClass mc = new ManagementClass("win32_processor");
                ManagementObjectCollection moc = mc.GetInstances();
                string processorid = "";
                string testext = "";
                foreach (ManagementObject mo in moc)
                {
                    processorid = mo["processorid"].ToString();
                    //MessageBox.Show(mo["processorid"].ToString());
    
    
                    using (FileStream fs = new FileStream("License.lic", FileMode.Open, FileAccess.Read, FileShare.None))
                    {
                        int iXH = 0;
                        using (StreamReader sr = new StreamReader(fs))
                        {
                            // sw.Write("None;zh-cn;None;8H489467LS631834L;CuteEditor.Editor for asp.net is licensed.;1.6;5;51aspx.com;125.76.229.233;09/09/2099");
                            //testext = sr.ReadToEnd();
                            string line = sr.ReadLine();
                            //MessageBox.Show(line);
                            //while (!sr.EndOfStream)
                            //{
                            //    if (!string.IsNullOrEmpty(line))
                            //    {
                            //        line = line.Trim();
    
                            //        if (line.StartsWith("SoftWare_ID"))
                            //        {
                            //            MessageBox.Show(line);
                            //        }
                            //    }
    
                            //    line = sr.ReadLine();
                            //}
    
                            while ((line = sr.ReadLine()) != null)
                            {
                                //这里的Line就是您要的的数据了
                                iXH++;//计数,总共几行
                               line = sr.ReadLine();
                               if (!string.IsNullOrEmpty(line))
                               {
                                   line = line.Trim();
    
                                   if (line.StartsWith("ISSUED=10caprc2013 ck=246 SIGN=0530 5C25 E534 748D 8C6D 18B4"))
                                   {
                                       line = sr.ReadLine().Substring(0,44);
                                       string text = decrption(line, key.Substring(0, 32), iv.Substring(0, 16));
                                       this.textBox6.Text = text;
    
                                       if (text == this.textBox4.Text)
                                       {                                     
                                           line = sr.ReadLine();
                                           line = sr.ReadLine();
                                           string date001 = decrption(line, key.Substring(0, 32), iv.Substring(0, 16));
                                           // MessageBox.Show(date001);
                                           line = sr.ReadLine();
                                           line = sr.ReadLine();
                                           string date002 = decrption(line, key.Substring(0, 32), iv.Substring(0, 16));
                                           // MessageBox.Show(date002);
                                           System.DateTime currentTime = new System.DateTime();
                                           currentTime = System.DateTime.Now;
                                           string[] s1 = date001.Split(new char[] { '/' });
                                           string[] s2 = date002.Split(new char[] { '/' });
                                           int date01year = Int32.Parse(s1[0]);
                                           int date02year = Int32.Parse(s2[0]);
                                           int date01month = Int32.Parse(s1[1]);
                                           int date02month = Int32.Parse(s2[1]);
                                           int date01day = Int32.Parse(s1[2]);
                                           int date02day = Int32.Parse(s2[2]);
                                           DateTime date01 = new DateTime(date01year, date01month, date01day);
                                           DateTime date02 = new DateTime(date02year, date02month, date02day);
    
                                           if (IsInTimeInterval(currentTime, date01, date02) == true)
                                           {
                                               MessageBox.Show("许可证文件正确,且在授权期限内");
                                           }
                                           else
                                               MessageBox.Show("许可证文件已失时效");
    
                                       }
                                       else
                                       { MessageBox.Show("许可证文件非法!","提示"); }
    
                                   }
                               }
                            }
                        }
                        
                        Console.ReadLine();
    
                    }
                    //string text = decrption(this.textBox5.Text, key.Substring(0, 32), iv.Substring(0, 16));
                    //this.textBox6.Text = text;
                    //if (text == this.textBox4.Text)
                    //{
                    //    MessageBox.Show("许可证文件正确");
                    //}
                }
            }
    
            private bool IsInTimeInterval(DateTime time, DateTime startTime, DateTime endTime)
            {
                //判断时间段开始时间是否小于时间段结束时间,如果不是就交换
                if (startTime > endTime)
                {
                    DateTime tempTime = startTime;
                    startTime = endTime;
                    endTime = tempTime;
                }
    
                //获取以公元元年元旦日时间为基础的新判断时间
                DateTime newTime = new DateTime();
                newTime = time;
                //newTime = newTime.AddHours(time.Hour);
                //newTime = newTime.AddMinutes(time.Minute);
                //newTime = newTime.AddSeconds(time.Second);
    
                //获取以公元元年元旦日时间为基础的区间开始时间
                DateTime newStartTime = new DateTime();
                newStartTime = startTime;
                //newStartTime = newStartTime.AddHours(startTime.Hour);
                //newStartTime = newStartTime.AddMinutes(startTime.Minute);
                //newStartTime = newStartTime.AddSeconds(startTime.Second);
    
                //获取以公元元年元旦日时间为基础的区间结束时间
                DateTime newEndTime = new DateTime();
                newEndTime = endTime;
                //if (startTime.Hour > endTime.Hour)
                //{
                //    newEndTime = newEndTime.AddDays(1);
                //}
                //newEndTime = newEndTime.AddHours(endTime.Hour);
                //newEndTime = newEndTime.AddMinutes(endTime.Minute);
                //newEndTime = newEndTime.AddSeconds(endTime.Second);
    
                if (newTime >= newStartTime && newTime < newEndTime)
                {
                    return true;
                }
                return false;
            }
        }
        
    }
    
    Liscense生成器主界面代码


    using System;
    using System.Collections.Generic;
    using System.Windows.Forms;
    
    namespace CuteEditorLic
    {
        static class Program
        {
            /// <summary>
            /// 应用程序的主入口点。
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new 许可证文件生成器());
            }
        }
    }
    主程序入口代码


    3. 执行代码生成Liscense文件



    点击生成按钮获取本机CPU-ID



    获取本机CPU-ID




    将本机CPU-ID粘贴至待生成CPU-ID框中




    选择License授权时限




    生成许可证文件




    验证许可证文件

    第二步:生成获取ProcessorID的C++ DLL


    #ifndef __Copyright_H__
    #define __Copyright_H__
    #include <Windows.h>
    #include <stdio.h>
    #include <tchar.h>
    #include <string>
    using namespace std;
    #ifdef Copyright_EXPORTS
    #define Copyright_EXPORTS __declspec(dllexport)
    #else
    #define Copyright_EXPORTS _declspec(dllimport)
    #endif
    extern"C" Copyright_EXPORTS void GetProcessor(INT32 *a, INT32 *b);
    #endif
    头文件代码


    #include "Copyright.h"
    #if _MSC_VER >=1400	
    #include <intrin.h>	// 所有Intrinsics函数
    #endif
    
    char szBuf[64];
    INT32 dwBuf[4];
    
    #if defined(_WIN64)
    // 64位下不支持内联汇编. 应使用__cpuid、__cpuidex等Intrinsics函数。
    #else
    #if _MSC_VER < 1600	// VS2010. 据说VC2008 SP1之后才支持__cpuidex
    void __cpuidex(INT32 CPUInfo[4], INT32 InfoType, INT32 ECXValue)
    {
    	if (NULL == CPUInfo)	return;
    	_asm{
    		// load. 读取参数到寄存器
    		mov edi, CPUInfo;	// 准备用edi寻址CPUInfo
    		mov eax, InfoType;
    		mov ecx, ECXValue;
    		// CPUID
    		cpuid;
    		// save. 将寄存器保存到CPUInfo
    		mov[edi], eax;
    		mov[edi + 4], ebx;
    		mov[edi + 8], ecx;
    		mov[edi + 12], edx;
    	}
    }
    #endif	// #if _MSC_VER < 1600	// VS2010. 据说VC2008 SP1之后才支持__cpuidex
    
    #if _MSC_VER < 1400	// VC2005才支持__cpuid
    void __cpuid(INT32 CPUInfo[4], INT32 InfoType)
    {
    	__cpuidex(CPUInfo, InfoType, 0);
    }
    #endif	// #if _MSC_VER < 1400	// VC2005才支持__cpuid
    
    #endif	// #if defined(_WIN64)
    
    void GetProcessor(INT32 *a, INT32 *b)
    {
    	__cpuidex(dwBuf, 1, 1);
    	char szTmp[33] = { NULL };
    	*a = dwBuf[3];
    	*b = dwBuf[0];
    }
    

    CPP代码



    第三步:生成验证许可证文件的C# DLL


    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Text;
    using System.IO;
    using System.Security.Cryptography;
    using System.Diagnostics;
    using System.Globalization;
    
    namespace Cryption
    {
        public class MyClass
        {
    
            private string key = "alskdfsakjsdikfhkjgfhjmvnnxfksajkwke135466dvfdsgjkfdhgskjsagbbkhfdgn";
            private string iv = "qjhsqjhwencgfuyuyggkxgzzmgfmhgjhkjhkmjfjhfnsks4464fsdgffdhghgsdf";
            public int  Verification(string processorid)
            {
                    try
                    {
                        using (FileStream fs = new FileStream("License.lic", FileMode.Open, FileAccess.Read, FileShare.None))
                        {
                            int iXH = 0;
                            using (StreamReader sr = new StreamReader(fs))
                            {
                                string line = sr.ReadLine();
                                while ((line = sr.ReadLine()) != null)
                                {
                                    iXH++;//计数,总共几行
                                    line = sr.ReadLine();
                                    if (!string.IsNullOrEmpty(line))
                                    {
                                        line = line.Trim();
    
                                        if (line.StartsWith("ISSUED=10caprc2013 ck=246 SIGN=0530 5C25 E534 748D 8C6D 18B4"))
                                        {
                                            line = sr.ReadLine().Substring(0,44);
                                            string text = decrption(line, key.Substring(0, 32), iv.Substring(0, 16));
                                            if (text == processorid)
                                            {
                                                line = sr.ReadLine();
                                                line = sr.ReadLine();
                                                string date001 = decrption(line, key.Substring(0, 32), iv.Substring(0, 16));
                                                line = sr.ReadLine();
                                                line = sr.ReadLine();
                                                string date002 = decrption(line, key.Substring(0, 32), iv.Substring(0, 16));
                                                System.DateTime currentTime = new System.DateTime();
                                                currentTime = System.DateTime.Now;
                                                string[] s1 = date001.Split(new char[] { '/' });
                                                string[] s2 = date002.Split(new char[] { '/' });
                                                int date01year = Int32.Parse(s1[0]);
                                                int date02year = Int32.Parse(s2[0]);
                                                int date01month = Int32.Parse(s1[1]);
                                                int date02month = Int32.Parse(s2[1]);
                                                int date01day = Int32.Parse(s1[2]);
                                                int date02day = Int32.Parse(s2[2]);
                                                DateTime date01 = new DateTime(date01year, date01month, date01day);
                                                DateTime date02 = new DateTime(date02year, date02month, date02day);
    
                                                if (IsInTimeInterval(currentTime, date01, date02) == true)
                                                {
                                                    return 0;//许可证文件正确,且在授权期限内
                                                }
                                                else
                                                {
                                                    return 2;//许可证文件已失时效
                                                }
    
    
                                            }
                                            else
                                            {
                                                return 3;//许可证文件非法!
    
                                            }
    
                                        }
                                    }
                                }
    
                            }
    
                            Console.ReadLine();
    
                        }
                    }
                    catch
                    {
                        return 1; //没有许可证文件
                    }
                    return 4;
            }
            private bool IsInTimeInterval(DateTime time, DateTime startTime, DateTime endTime)
            {
                //判断时间段开始时间是否小于时间段结束时间,如果不是就交换
                if (startTime > endTime)
                {
                    DateTime tempTime = startTime;
                    startTime = endTime;
                    endTime = tempTime;
                }
    
                //获取以公元元年元旦日时间为基础的新判断时间
                DateTime newTime = new DateTime();
                newTime = time;
    
                //获取以公元元年元旦日时间为基础的区间开始时间
                DateTime newStartTime = new DateTime();
                newStartTime = startTime;
    
                //获取以公元元年元旦日时间为基础的区间结束时间
                DateTime newEndTime = new DateTime();
                newEndTime = endTime;
    
                if (newTime >= newStartTime && newTime < newEndTime)
                {
                    return true;
                }
                return false;
            }
            public string encrption(string input, string key, string iv)
            {
                MemoryStream msEncrypt = null;
                RijndaelManaged aesAlg = null;
    
                string sresult = string.Empty;
    
                try
                {
                    byte[] keys = System.Text.Encoding.UTF8.GetBytes(key);
                    byte[] ivs = System.Text.Encoding.UTF8.GetBytes(iv);
                    aesAlg = new RijndaelManaged();
                    aesAlg.Key = keys;
                    aesAlg.IV = ivs;
    
                    ICryptoTransform ict = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
                    msEncrypt = new MemoryStream();
    
                    using (CryptoStream cts = new CryptoStream(msEncrypt, ict, CryptoStreamMode.Write))
                    {
                        using (StreamWriter sw = new StreamWriter(cts))
                        {
                            sw.Write(input);
                        }
                    }
    
                }
                finally
                {
                    if (aesAlg != null)
                    {
                        aesAlg.Clear();
                    }
                }
    
                if (msEncrypt != null)
                {
                    byte[] content = msEncrypt.ToArray();
    
                    sresult = Convert.ToBase64String(content);
                }
    
                return sresult;
            }
    
            public string decrption(string input, string key, string iv)
            {
                string sresult = string.Empty;
    
                byte[] keys = System.Text.Encoding.UTF8.GetBytes(key);
                byte[] ivs = System.Text.Encoding.UTF8.GetBytes(iv);
    
                byte[] inputbytes = Convert.FromBase64String(input);
    
                RijndaelManaged rm = null;
    
                try
                {
                    rm = new RijndaelManaged();
                    rm.Key = keys;
                    rm.IV = ivs;
    
                    ICryptoTransform ict = rm.CreateDecryptor(rm.Key, rm.IV);
    
                    using (MemoryStream ms = new MemoryStream(inputbytes))
                    {
                        using (CryptoStream cs = new CryptoStream(ms, ict, CryptoStreamMode.Read))
                        {
                            using (StreamReader sr = new StreamReader(cs))
                            {
                                sresult = sr.ReadToEnd();
                            }
                        }
                    }
    
                }
                finally
                {
                    if (rm != null)
                    {
                        rm.Clear();
                    }
                }
    
                return sresult;
            }
    
        }
    }
    
    C#验证代码


    第四步:在Unity中使用两个DLL





    Unity中加载dll


    第五步:测试结果


    using UnityEngine;
    using System.Collections;
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Text;
    using System.IO;
    using System.Security.Cryptography;
    using System.Globalization;
    using System.Runtime.InteropServices;
    using Cryption;
    public class test : MonoBehaviour {
    
         [DllImport("Copyright")]
        private static extern void GetProcessor(out Int32 a, out Int32 b);
    	void Start () {
            MyClass class1 = new MyClass();
            Int32 a;
            Int32 b;
            GetProcessor(out a, out b);
            string ssss = a.ToString("X8");
            string bbbbb = b.ToString("X8");
            string cc = ssss + bbbbb;
            Debug.Log(class1.Verification(cc));
    	
    	}
    	void Onable()
        {
            
    
        }
    	// Update is called once per frame
    	void Update () {
    
    
    	}
    }
    
    测试结果代码



    测试结果代码

    展开全文
  • blender 插件 我使用LEGO CAD记录自己的一些创作(或“ MOC”,因为在一些数字LEGO社区中称为自定义集)。 计算机辅助设计(CAD)的优点是精度高。 当您使用CAD在虚拟空间中构建对象时,您可以合理地期望它可以在...

    blender 插件

    我使用LEGO CAD记录自己的一些创作(或“ MOC”,因为在一些数字LEGO社区中称为自定义集)。 计算机辅助设计(CAD)的优点是精度高。 当您使用CAD在虚拟空间中构建对象时,您可以合理地期望它可以在现实世界中构建。 尽管我使用的LEGO CAD应用程序没有仿真物理来验证我的设计的结构完整性,但我确实在软件中铺了一块砖,以模仿我在现实生活中制作的模型。

    Bricker可以通过单击一个按钮将您的3D模型转换为LEGO模型。

    安装Bricker

    您可以从BlenderMarket上以$ 65 USD的价格购买Bricker,并且该许可证已根据GPLv3许可。 支付费用有助于开发和支持。

    要安装Bricker,请启动Blender,单击“ 编辑”菜单,然后选择“首选项” 在“首选项”窗格中,单击左侧的“ 加载项”选项卡。

    Installing an add-on in Blender

    (Seth Kenlon, CC BY-SA 4.0

    在“ 附加组件”窗格右上方的搜索框中开始输入“ Bricker”,单击“ 安装”按钮,并在出现提示时选择Bricker ZIP文件。

    将3D模型转换为乐高积木

    无论您是使用普通的灰色立方体的通用起点,自己创建的精美模型,还是从Blender模型中心下载的内容,都可以在安装后立即尝试使用Bricker。

    首先,单击要转换为乐高模型的模型。 选择模型后,按键盘上的N键以打开“ 属性”面板。 单击“ Bricker属性”选项卡,然后单击“ 新建Brick模型”按钮。

    Bricker properties

    (Seth Kenlon, CC BY-SA 4.0

    现在您已将模型添加到Bricker中,单击Bricker面板中的新Brickify对象按钮。

    默认设置呈现出非常漂亮的块状模型,大部分为2x10的砖块,没有板,细节也不多。

    Blocks in Bricker

    (Seth Kenlon, CC BY-SA 4.0

    但是Bricker插件中有很多选项可供您自定义,一旦您对模型进行实体化,它们就会显示在Bricker 属性面板中。

    Bricker settings

    (Seth Kenlon, CC BY-SA 4.0

    模型设置”面板中最重要的设置是:

    • 砖高设置模型中每个砖的高度。 较大的设置会产生较不详细的模型,因为用于雕刻的砖块较少。
    • 拆分模型使每个渲染的砖块成为可以在Blender中移动的对象。 如果不启用此功能,则您的模型看起来像很多砖块,但是它们的作用就像将它们全部粘在一起。
    • 砖类型控制雕塑是否由砖,板,砖和板,砖等制成。
    • “最大尺寸”设置雕塑中砖和板的最大尺寸。
    • 合法砖头仅确保所有砖头都基于真实砖头。 例如,启用此功能可防止它生成3x7的块或2x11的板,因为在LEGO目录中(或至少在LDraw Parts库中没有)。

    在“ 详细信息”面板中,您可以控制砖块的底面是平坦的(不是很逼真,但是要“更便宜”才能渲染)还是要进行细化以模仿实际乐高积木的底面。

    更改设置后,必须单击Bricker属性面板顶部附近的“ 更新模型”按钮以重新渲染雕塑。

    Red dragon model in Bricker

    (Seth Kenlon, CC BY-SA 4.0

    砖化您的设计

    Bricker是Blender的一个有趣的风格插件。 尽管它可能不是设计真正的LEGO套装的首选工具,但它是使用虚拟LEGO进行雕刻,绘制和动画处理的好方法。 如果您一直在推迟制作乐高定格电影《大酒杯》,现在是时候进入虚拟世界了。

    翻译自: https://opensource.com/article/20/7/lego-blender-bricker

    blender 插件

    展开全文
  • 一路next,安装好后会有两个文件: Live2D Cubism Viewer 4.0(这个是查看模型的软件) Live2D Cubism Editor 4.0(这个是制作模型的软件) Live2D Cubism Editor 4.0有pro版和free版,用free版就行...

    1.准备

    1.1下载live2d

    live2d官网:https://www.live2d.com 如果下载的慢文章最后有百度云下载链接
    在这里插入图片描述

    在这里插入图片描述

    1.2安装live2d

    一路next,安装好后会有两个文件:
    Live2D Cubism Viewer 4.0(这个是查看模型的软件)
    Live2D Cubism Editor 4.0(这个是制作模型的软件)
    Live2D Cubism Editor 4.0有pro版和free版,用free版就行

    1.3 下载sdk

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    2.制作模型

    https://www.bilibili.com/video/av73648216?p=1
    这个教程是2.0的,2.0导出的是 .moc 文件,而新版的导出的是 .moc3 文件
    在这里插入图片描述
    注意:导出前要 Ctrl + T 再点击ok一下(生成纹理),不然无法导出
    导出后是个文件夹,将文件夹中的 .moc3 文件拖入Live2D Cubism Viewer 4.0软件就能查看效果

    3.sdk

    官方sdk api:https://docs.live2d.com/cubism-sdk-tutorials/sample-build-web/

    3.1运行实例

    需要环境:node.js TypeScript Webpack (TypeScript和Webpack安装慢可以使用淘宝镜像)
    编辑器打开sdk项目,具体的目录是什么内容可以看项目根目录下的 README.md 文件(windows用户可以使用Typora软件打开.md文件)

    1. 打开控制台跳转到Demo文件夹下输入 npm install 命令(安装了淘宝镜像的可以使用cnpm install命令安装的快一些)
      install命令会根据package.json 文件中的配置下载安装需要的插件在这里插入图片描述
      这里已经安装好了,安装好后在Demo文件夹下回多出一个 node_modules 文件夹
    2. 运行 npm run build命令
      在这里插入图片描述
      运行完成后会在Demo文件夹下生成一个 dist 文件夹,该文件夹下有一个bundle.js,这个就是集合打包好的js文件,在index.html文件中有引用
    3. 运行 npm run serve命令,启动服务器
      在这里插入图片描述
      4.在浏览器中输入 http://localhost:5000/Samples/TypeScript/Demo/ 就能看到
      在这里插入图片描述
      具体的其他命令可以查看跟Demo文件夹同级的 README.md 文件, 在package.json文件中也能看到
      在这里插入图片描述

    3.2源码

    想把一些配置放到html中,比如画布(canvas)的大小位置,模型保存的路径等等信息
    否则每次需要改变模型的时候都要改代码,重新编译,麻烦
    lappdefine.ts //定义基本的参数
    lappdelegate.ts //初始化,释放资源,事件绑定
    lapplive2dmanager.ts //模型的管理类,进行模型生成和废弃、事件的处理、模型切换。
    lappmodel.ts //模型类,定义模型的基本属性
    lappal.ts //读取文件,抽象文件数据(算是工具类)
    lappsprite.ts //动画精灵类,(学python时知道了精灵类和精灵组)
    lapptexturemanager.ts//纹理管理类,进行图像读取和管理的类
    lappview.ts //视图类,生成模型的图像被lapplive2dmanager管理
    main.ts //主程序启动程序
    touchmanager.ts //事件的管理类(比如移动鼠标,点击鼠标,触摸屏触碰等)

    这里所有的类都实行单例模式

    3.2.2 界面(index.html)

    这里用了flask框架(别问为啥简单方便快)

    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="utf-8">
      <meta name="viewport" content="width=1900">
      <title>TypeScript HTML App</title>
      <link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='live2d/css/live2d.css') }}"/>
      <style>
        html, body {
            margin: 0;
            background-color: #22d7dd;
        }
    
      </style>
      <script type="text/javascript" src="{{ url_for('static', filename='live2d/js/jquery.js') }}"></script>
      <!-- Pollyfill script -->
      <script src="https://unpkg.com/core-js-bundle@3.6.1/minified.js"></script>
      <!-- Live2DCubismCore script -->
      <script src="{{ url_for('static', filename='live2d/js/live2dcubismcore.js') }}"></script>
      <!-- Build script -->
      <script src="{{ url_for('static', filename='live2d/js/bundle.js') }}"></script>
    
    </head>
    <body>
        1234567890
        <div class="live2d-main">
            <div class="live2d-tips"></div>
            <!-- 这里可以定义画布的大小位置 -->
            <canvas id="live2d" width="280" height="250" class="live2d"></canvas>
            <div class="tool">
                <span class="fui-home"></span>
                <span class="fui-chat"></span>
                <span class="fui-eye"></span>
                <span class="fui-user"></span>
                <span class="fui-photo"></span>
                <span class="fui-info-circle"></span>
                <span class="fui-cross"></span>
            </div>
        </div>
    </body>
    <script src="{{ url_for('static', filename='live2d/js/message.js') }}"></script>
    <script type="text/javascript">
      var resourcesPath = '/live2d/model/';  // 指定资源文件(模型)保存的路径
      var backImageName = ''; // 指定背景图片
      var modelDir = 'Haru,Hiyori,Mark,Natori,Rice,zwt';  // 指定需要加载的模型
      init();  // 初始化模型,属于message.js文件
    </script>
    </html>
    
    3.2.2 管理(message.js)
    // 初始化
    function init(){	
        var resourcesPaths = `${resourcesPath}`;
        var backImageNames = `${backImageName}`;
        var modelDirString = `${modelDir}`;
        var modelDirs = modelDirString.split(',');
    
        initDefine(resourcesPaths, backImageNames, modelDirs);  // lappdefine.ts开放的接口用于初始化常量被编译到bundle.js文件里
    }
    
    // 监听复制(这里简单添加了一些事件,可以添加更多的事件,比如报时等)
    (function() {
        document.addEventListener('copy',(e)=>{
          e.preventDefault();
          e.stopPropagation();
          showMessage('你都复制了些什么呀,能让我看看吗?', 5000, true); // 显示信息
        })
    }());
    // 工具栏的点击事件
    $('.tool .fui-home').click(function (){
    });
    
    $('.tool .fui-eye').click(function (){
    });
    
    $('.tool .fui-chat').click(function (){
    });
    
    $('.tool .fui-user').click(function (){
    });
    
    $('.tool .fui-info-circle').click(function (){
    });
    
    $('.tool .fui-cross').click(function (){
    });
    
    $('.tool .fui-photo').click(function (){
    });
    
    
    function showMessage(text, timeout, flag){
        if(flag || sessionStorage.getItem('waifu-text') === '' || sessionStorage.getItem('waifu-text') === null){
            if(Array.isArray(text)) text = text[Math.floor(Math.random() * text.length + 1)-1];
            //console.log(text);
            if(flag) sessionStorage.setItem('waifu-text', text);
            $('.live2d-tips').stop();
            $('.live2d-tips').html(text).fadeTo(200, 1);
            if (timeout === undefined) timeout = 5000;
            hideMessage(timeout);
        }
    }
    
    function hideMessage(timeout){
        $('.live2d-tips').stop().css('opacity',1);
        if (timeout === undefined) timeout = 5000;
        window.setTimeout(function() {sessionStorage.removeItem('waifu-text')}, timeout);
        $('.live2d-tips').delay(timeout).fadeTo(200, 0);
    }
    
    3.2.2 基本参数(lappdefine.ts)

    由于使用Webpack打包,Typescript文件中的变量和函数被层层括号包围(封装)变成了内部变量和内部函数(具体可以百度Webpack的打包原理),在外部的js文件是调用不到里面的方法的,所以将一些函数或变量挂载到window下,成为全局变量或函数,使外部的js文件也能调用到
    在lappdefine.ts文件最后添加

    export const win: any = window
    
    win.initDefine=function(resourcesPath: string, backImageName: string, modelDir: string[]){
        ResourcesPath = resourcesPath;
        BackImageName = backImageName;
        ModelDir = modelDir;
        ModelDirSize = modelDir.length;
    }
    

    这里将initDefine挂载到window下是函数能在外部调用,函数在message.js中调用到
    (注意:这里要将ResourcesPathBackImageNameModelDirModelDirSize变量声明成let属性 const 是常量只允许在声明的时候赋值,并且只能赋值一次)

    3.2.2 主函数(main.ts)
    import { LAppDelegate } from './lappdelegate';
    
    // 浏览器装入后的处理(打开页面)
    window.onload = (): void => {
      // create the application instance
      if (LAppDelegate.getInstance().initialize() == false) {
        return;
      }
      LAppDelegate.getInstance().run();
    };
    
    //结束时的处理 (刷新或关闭页面)
    window.onbeforeunload = (): void => LAppDelegate.releaseInstance(); //lambda 匿名函数
    

    LAppDelegate.getInstance().initialize() 获得这个类的实例并初始化

    3.2.3 LAppDelegate.getInstance().initialize()(lappdelegate.ts)
    public initialize(): boolean {
        // 创建画布
        // canvas = document.createElement('canvas');
        // canvas.width = LAppDefine.RenderTargetWidth;
        // canvas.height = LAppDefine.RenderTargetHeight;
        // 原来是用js动态在网页上创建画布,画布的长宽在lappdefine.ts指定,现在直接在html中已经有了画布直接拿过来使用就行
        canvas = <HTMLCanvasElement>document.getElementById("live2d"); // index.html中的id为live2d的画布
        canvas.width = canvas.width;
        canvas.height = canvas.height;
        canvas.toDataURL("image/png");
    
    	// 这个是index.html工具栏中的眼睛图标,点击眼睛图标就切换下一个模型
    	// 正规来说应该留个切换模型的口子,在message.js中调用,因为懒就直接在这里写了
        fui_eye = <HTMLSpanElement>document.getElementsByClassName("fui-eye")[0];
    
        // 初始化gl上下文 (代码段结束后有解释)
        // @ts-ignore
        gl = canvas.getContext('webgl',{alpha: true }) || canvas.getContext('experimental-webgl');
    
        if (!gl) {
          alert('Cannot initialize WebGL. This browser does not support.\n不能初始化WebGL,该浏览器不支持WebGL,请切换浏览器重试');
          gl = null;
          document.body.innerHTML =
            '该浏览器不支持 <code>&lt;canvas&gt;</code> 标签元素,请切换浏览器重试 .';
          // gl初期化失敗
          return false;
        }
    
        // 向DOM添加画布
        // document.body.appendChild(canvas);  
    
        if (!frameBuffer) {
          frameBuffer = gl.getParameter(gl.FRAMEBUFFER_BINDING);
        }
    
        // 透明设置
        gl.enable(gl.BLEND);
        gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
    
        const supportTouch: boolean = 'ontouchend' in canvas;  //是否支持触碰(触摸屏)
    
        if (supportTouch) {   // 没有触屏电脑(两种事件都要注册)
          // 注册触摸相关的回掉函数  (触摸屏)
          canvas.ontouchstart = onTouchBegan;
          canvas.ontouchmove = onTouchMoved;
          canvas.ontouchend = onTouchEnded;
          canvas.ontouchcancel = onTouchCancel;
        } else {
          // 注册鼠标相关的回呼函数
          canvas.onmousedown = onClickBegan;
          // canvas.onmousemove = onMouseMoved;   //原来是在画布上注册鼠标移动事件,鼠标移出画布就监听不到
          window.onmousemove = onMouseMoved;  //对整个window窗口监听,是角色跟随鼠标,需要对鼠标坐标获取做调整
          canvas.onmouseup = onClickEnded;
          fui_eye.onmousedown = (): void => {	// 工具栏眼睛图标点击事件
            const live2DManager: LAppLive2DManager = LAppLive2DManager.getInstance();
            live2DManager.nextScene();
          };
        }
    
        // AppView的初始化
        this._view.initialize();
    
        // Cubism SDK的初始化
        this.initializeCubism();
    
        return true;
      }
    

    contextType参数有以下四种:
    注:早期WebGL的context,还不能通过正式的名称webgl来获取,必须使用experimental-webgl来获取context对象。

    2d”,创建一个CanvasRenderingContext2D对象作为2D渲染的上下文。
    webgl”(或“experimental-webgl”),创建一个WebGLRenderingContext对象作为3D渲染的上下文,只在实现了WebGL 2的浏览器上可用,实验性特性。
    webgl2”,创建一个WebGL2RenderingContext对象作为3D渲染的上下文,只在实现了WebGL 3的浏览器上可用。
    bitmaprenderer”,创建一个ImageBitmapRenderingContext,用于将位图渲染到canvas上下文上,实验性特性。

    原文链接:https://blog.csdn.net/acoolgiser/article/details/85800799

    onMouseMoved(lappdelegate.ts)
    // 鼠标移动后的回掉
    function onMouseMoved(e: MouseEvent): void {
      // if (!LAppDelegate.getInstance()._captured) {  // 判断是否单击,原来是要按住鼠标左键图像才会跟着鼠标动
      //   return;
      // }
      if (!LAppDelegate.getInstance()._view) {   //获得lappview.ts的实例对象
        LAppPal.printMessage('view notfound');
        return;
      }
      // e.clientX和e.clientY获取的坐标点都是以左上角为原点
      const rect = (e.target as Element).getBoundingClientRect();
      // const posX: number = e.clientX - rect.left;
      // const posY: number = e.clientY - rect.top;
      let posX: number = e.clientX;
      let posY: number = e.clientY - window.innerHeight + canvas.height;
    
      // 图像在网页的坐下角,简单处理坐标将超过画布边界坐标就等与边界坐标
      posX = (posX > canvas.width) ? canvas.width : posX;
      posY = (posY < 0) ? 0 : posY;
    
      LAppDelegate.getInstance()._view.onTouchesMoved(posX, posY);// 这个就不做解释,就是转换坐标,调用LAppLive2DManager类重新绘制图像
    }
    

    假设屏幕是一个九宫格(万能神奇的九宫格哈哈)
    在这里插入图片描述
    回到**initialize()**函数,在initialize()后有两个初始化的函数
    this._view.initialize() (lappview.ts)主要就是指定一些图像的参数,例如画面的范围相对,设置当前矩阵的放大率等
    this.initializeCubism()(lappdelegate.ts)

    3.2.4 this.initializeCubism() (lappdelegate.ts)
    public initializeCubism(): void {
        // setup cubism 设置cubism
        this._cubismOption.logFunction = LAppPal.printMessage;  //初始化控制台打印信息工具,就是console.log
        this._cubismOption.loggingLevel = LAppDefine.CubismLoggingLevel;  //指定打印日志的等级
        Csm_CubismFramework.startUp(this._cubismOption);
    
        // initialize cubism 初始化设置cubism
        Csm_CubismFramework.initialize();
    
        // load model 加载模型
        LAppLive2DManager.getInstance();
    
        // 更新时间
        LAppPal.updateTime();
    
        this._view.initializeSprite();
      }
    

    Csm_CubismFramework.initialize()底层的初始化设置
    LAppLive2DManager.getInstance()模型管理类的初始化,单例模型没什么好说的,注意这个类在构造方法中会加载模型下段代码所示:

    // (lapplive2dmanager.ts)
    public changeScene(index: number): void {
        this._sceneIndex = index;
        if (LAppDefine.DebugLogEnable) {   //要是调试的情况下打印信息
          LAppPal.printMessage(`[APP]model index: ${this._sceneIndex}`);
        }
    
        // 从ModelDir[]中保存的目录名称
        // 要使目录名和model 3.json的名字一致。
        const model: string = LAppDefine.ModelDir[index];
        const modelPath: string = LAppDefine.ResourcesPath + model + '/';
        let modelJsonName: string = LAppDefine.ModelDir[index];
        modelJsonName += '.model3.json';    //拼接生成模型路径
    
        this.releaseAllModel();    //清除原来显示的模型
        this._models.pushBack(new LAppModel());   // 推入管理栈堆
        this._models.at(0).loadAssets(modelPath, modelJsonName);  //加载模型,lappmodel.ts异步请求服务器模型资源
      }
      
      //  构造器
      constructor() {
        this._viewMatrix = new Csm_CubismMatrix44();
        this._models = new Csm_csmVector<LAppModel>();
        this._sceneIndex = 0;
        this.changeScene(this._sceneIndex);		//第一次加载模型
      }
    

    这里在往下深入就是 lappmodel.ts 加载定义相关的模型信息例如模型的大小等
    loadAssets(modelPath, modelJsonName)异步加载模型的json文件到缓存中===>
    CubismModelSettingJson(buffer, size)模型json文件的缓存,和缓存大小===>
    this.setupModel(setting: CubismModelSettingJson); 根据模型json文件中的信息异步请求去加载模型及相关的文件(例如动作文件、物理文件等)===>
    loadModel(buffer: ArrayBuffer) 模型文件缓存,去加载生成模型===>
    this._modelMatrix = new CubismModelMatrix(this._model.getCanvasWidth(), this._model.getCanvasHeight());根据画布的大小去生成模型===>
    this.setHeight(1.0);根据画布的高度去生成一个正方形模型坐标系(4*4)调整里面的参数可以调整模型区域的大小(玄学的数字为什么没看懂,有待研究)

    3.2.5 this._view.initializeSprite() (lappview.ts)

    回到 LAppDelegate.initialize()(lappdelegate.ts),在initialize()的最后会调用 this._view.initializeSprite()方法

      // 进行图像的初始化,一些不重要的元素初始化。这里有一个齿轮设置的图像,里面的内容替换成了眼睛的图标,没用所以注释掉,还加了一个背景图片加载的判断,没有背景图片就不加载
      public initializeSprite(): void {
        const width: number = canvas.width;
        const height: number = canvas.height;
    
        const textureManager = LAppDelegate.getInstance().getTextureManager();   // 从LAppDelegate类中得到纹理管理器
        const resourcesPath = LAppDefine.ResourcesPath;
    
        let imageName = '';
    
        // 背景图像初始化
        imageName = LAppDefine.BackImageName;
    
        if(imageName != "" && imageName != null){ //如果指定了背景图片,就加载
          // 由于异步,创建回调函数
          const initBackGroundTexture = (textureInfo: TextureInfo): void => {
            const x: number = width * 0.5;  //背景图片出现宽度的位置
            const y: number = height * 0.5; //背景图片出现高度的位置 
    
            const fwidth = textureInfo.width * 2.0;   //背景图片的宽度
            const fheight = height * 0.95;            //背景图片的高度
            this._back = new LAppSprite(x, y, fwidth, fheight, textureInfo.id);  //绘制背景图片
          };
    
          textureManager.createTextureFromPngFile(  //回掉函数
            resourcesPath + imageName,
            false,
            initBackGroundTexture
          );
        }
    
        // 齿轮图像初始化 (原来是右上角有一个齿轮的图片,点击齿轮图片切换模型)
        // imageName = LAppDefine.GearImageName;
        // // 齿轮初始化后的回掉函数
        // const initGearTexture = (textureInfo: TextureInfo): void => {
        //   const x = width - textureInfo.width * 0.5;   //出现在右上角 
        //   const y = height - textureInfo.height * 0.5;
    
        //   const fwidth = textureInfo.width;
        //   const fheight = textureInfo.height;
        //   this._gear = new LAppSprite(x, y, fwidth, fheight, textureInfo.id);
        // };
    
        // textureManager.createTextureFromPngFile(
        //   resourcesPath + imageName,
        //   false,
        //   initGearTexture
        // );
    
        // 创建阴影
        if (this._programId == null) {
          this._programId = LAppDelegate.getInstance().createShader();
        }
      }
    

    到这里初始化的工作基本完成了

    3.2.6 LAppDelegate.getInstance().run() (lappdelegate.ts)

    回到main.ts文件接下来就是执行LAppDelegate.getInstance().run()方法,没啥好说的,就是不断循环刷新画布,达到动画的效果

      // 执行处理
      public run(): void {
        // 主循环
        const loop = (): void => {
          // 确认有无实例
          if (s_instance == null) {
            return;
          }
    
          // 更新时间
          LAppPal.updateTime();
    
          // 画面的初始化
          gl.clearColor(0.0, 0.0, 0.0, 1.0);
    
          // 启动深度测试
          gl.enable(gl.DEPTH_TEST);
    
          // 附近的物体将远处的物体遮盖起来
          gl.depthFunc(gl.LEQUAL);
    
          // 清除彩色缓冲区和深度缓冲区  (加上这一句会导致有些浏览器背景变成黑色,而不是透明)
          // gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
    
          gl.clearDepth(1.0);
    
          // 透明设置
          gl.enable(gl.BLEND);
          gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
    
          // 绘图更新
          this._view.render();
    
          // 循环递归调用
          requestAnimationFrame(loop);
        };
        loop();
      }
    

    最后打包bundle.js,赋值bundle.js文件和Core核心文件live2dcubismcore.js就可以移植到任何项目了

    4成果

    在这里插入图片描述
    最后的模型是我做的哈哈,比较简单只会摇头眨眼,图片来自于网络,仅供于学习
    链接: https://pan.baidu.com/s/1SV-R3OCGlQ37BrPqKzo7lg 提取码: xg29

    展开全文
  • 1. 概述live2d是由日本Cybernoids公司开发,通过扭曲像素位置营造伪3d空间感的二维动画软件。官网下载安装包直接安装可以得到两种软件,分别是Cubism Modeler和Cubism Animator,最后我们还需要安装第三个软件Viewer...
  • 鄙人的2020秋招目前已经基本结束,最终拿了四家公司的offer,在综合比较之后目前已经有了明确的偏向,之后在尘埃落定后再写一篇感想总结把。现在把这两个月来整理的CPP复习资料做一个总结,希望日后能够帮助到需要...
  • cmake 深入 - 基础命令

    2020-01-10 19:04:47
    在前面我们了解到一些cmake的基本的使用方法,这里我们将对每个命令都做一些介绍,方便一些特定的需求。 基础命令 命令 说明 ...强制退出循环,和 foreach 或者 while 一起连用 ...cmake_parse_arguments...
1
收藏数 7
精华内容 2
关键字:

unity3d文件转化成moc