x哥(懂的都懂)的框架, 拿点代码过来做注释. 想了解详情可以去他的github

https://github.com/yimengfan/BDFramework.Core

# Object files

# Libraries

# Shared objects (inc. Windows DLLs)
*.so.*
*.dylib

# Executables
*.exe
*.out
*.app
*.i*
*.x86_64
*.hex
/TestProject/Library
/TestProject/obj
/TestProject/Temp
/TestProject/UnityPackageManager
/TestProject/Assembly-CSharp.csproj
/TestProject/Assembly-CSharp-Editor.csproj
/TestProject/Assembly-CSharp-Editor-firstpass.csproj
/TestProject/TestProject.sln
/TestProject/.idea/.idea.TestProject/.idea/contentModel.xml
/TestProject/.idea/.idea.TestProject/.idea/indexLayout.xml
/TestProject/.idea/.idea.TestProject/.idea/modules.xml
/TestProject/.idea/.idea.TestProject/.idea/workspace.xml
/TestProject/.idea/.idea.TestProject/riderModule.iml
/TestProject/TestProject.sln.DotSettings.user
/TestProject/UpgradeLog.htm
/TestProject/Assets/Resource/.svn
/TestProject/Assets/Code/.svn
/TestProject/.sonarqube
/TestProject/TestProject.Editor.Plugins.csproj
/TestProject/TestProject.Editor.csproj
/TestProject/TestProject.csproj
/TestProject/.idea/.idea.TestProject/.idea/encodings.xml
/TestProject/.idea/.idea.TestProject/.idea/sonarIssues.xml
/TestProject/.idea/.idea.TestProject/.idea/vcs.xml
/TestProject/.vs/TestProject/v15/.suo
/TestProject/.vs/TestProject/v15/Server/sqlite3/db.lock
/TestProject/.vs/TestProject/v15/Server/sqlite3/storage.ide
/TestProject/.vs
/TestProject/.idea
/TestProject/.idea
/TestProject/.vs
/TestProject/UnityDLL
/TestProject/*.err
/TestProject/*.tmp
/TestProject/*.cmdline
/TestProject/Unity.PackageManagerUI.Editor.csproj
/TestProject/Unity.TextMeshPro.Editor.csproj
/TestProject/Unity.TextMeshPro.csproj
/TestProject/UnityEditor.StandardEvents.csproj
/TestProject/Assets/Plugins/Editor/JetBrains/JetBrains.Rider.Unity.Editor.Plugin.Repacked.dll
/TestProject/Assets/Plugins/Editor/JetBrains
TestProject/Assets/Code/Game/Editor.meta
TestProject/Assets/Code/Game/Editor/AnimtionImport.meta
TestProject/Assets/Code/Game/Editor/Data.meta
TestProject/Assets/Code/Game/Editor/HeroEdit.meta
TestProject/Assets/Code/Game/Editor/RouteTool.meta
TestProject/Assets/Code/Game/Editor/AnimtionImport/Editor.meta
TestProject/Assets/Code/Game/Editor/HeroEdit/Editor.meta
TestProject/Assets/Code/Game/Editor/HeroEdit/Table.meta
TestProject/Assets/Code/Game/Editor/HeroEdit/TableAttributes.meta
TestProject/Assets/Code/Game/Editor/RouteTool/Editor.meta
TestProject/Assets/Plugins/iOS.meta
/TestProject/Assets/StreamingAssets/Windows/Art
/TestProject/Assets/StreamingAssets/iOS/Art
/TestProject/rotorz.dotnet-exception-utils.csproj
/TestProject/rotorz.dotnet-type-utils.csproj
/TestProject/rotorz.unity3d-editor-menu.editor.csproj
/TestProject/rotorz.unity3d-package-utils.editor.csproj
/TestProject/rotorz.unity3d-reorderable-list.csproj
/TestProject/rotorz.unity3d-reorderable-list.editor.csproj
/TestProject/rotorz.unity3d-utils.csproj
/TestProject/rotorz.unity3d-utils.editor.csproj
/TestProject/Assembly-CSharp-firstpass.csproj
/TestProject/ProjectSettings/ProjectVersion.txt
/TestProject/Logs
/TestProject/Assets/Code/BDFramework/Tools/ILRBuild/build.sln.meta
/TestProject/Assets/Code/BDFramework/Tools/ILRBuild/build.sln
/TestProject/Assets/Plugins/Editor/JetBrains.meta
/TestProject/Assets/Code/BDFramework/Tools/ILRBuild/build.exe.meta
/TestProject/Assets/Plugins/Sirenix/Odin Inspector/Config/Resources.meta
/TestProject/Assets/Plugins/Sirenix/Odin Inspector/Config/Resources/Sirenix.meta
/TestProject/Assets/3rdPlugins/.svn
/TestProject/Assets/DebugUILine.cs
/TestProject/Assets/DebugUILine.cs.meta
/TestProject/Assets/DebugUILine.cs
/TestProject/Assets/StreamingAssets/Windows/hotfix/Assembly-CSharp.dll.mdb.meta
/TestProject/Assets/StreamingAssets/Windows/hotfix/Assembly-CSharp.dll.mdb
/TestProject/Assets/Resource/Effect/.svn
/TestProject/Assets/StreamingAssets/.svn
/TestProject/Assets/3rdPlugins/com.unity.textmeshpro@1.3.0/Tests.meta
/TestProject/Assets/3rdPlugins/com.unity.textmeshpro@1.3.0/Tests

参考 ignore

PosPlus 教程 https://www.bilibili.com/video/av23948137

资源目录(大致)

Resource(不是Resources)     资源目录

  Effect               特效目录

  Font              字体目录

  handlers             协议目录

  Img               图片目录

  Model              模型目录

  Resources           打进本地包

  Runtime            运行时

  Scene               场景目录

  Shaders           Shader目录

  Table                Excel表目录

  TableEditor          JSON表目录

导入流程

原始文件

sunwukong@ani.txt(UTF-8)

Ctrl+D 复制动画信息

打开 Animation 窗口

删除 动画 Position 信息

创建 Animator Controller

将动画拖进 Animator Controller

添加脚本

#region    FPS计算

    float fps;
    float deltaTime = 0.0f;
    float msec;
    Rect rect;
    GUIStyle style = new GUIStyle();

    void Start() {
        int w = Screen.width, h = Screen.height;
        rect = , , , h *  / );
        style.alignment = TextAnchor.UpperLeft;
        style.fontSize = h *  / ;
        style.normal.textColor = new Color(1.0f, 0.0f, 0f, 1.0f);
    }

    void Update() {
        deltaTime += (Time.deltaTime - deltaTime) * 0.1f;
    }

    void OnGUI() {
        msec = deltaTime * 1000.0f;
        fps = 1.0f / deltaTime;

        GUI.Label(rect, string.Format("{0:0.0} ms ({1:0.} fps)", msec, fps), style);
    }

    #endregion

FPS计算

    [UnityEditor.MenuItem()]
    static public void DeleteModelUnuseData()
    {
        var path = Application.dataPath + "/Resource/Runtime/Char";

        var fs = Directory.GetFiles(path, "*.prefab", SearchOption.AllDirectories);

        ;
        foreach (var f in fs)
        {
            i++;
            EditorUtility.DisplayProgressBar("处理模型", Path.GetFileName(f), i / fs.Length);
            //
            var absPath = "Assets" + f.Replace(Application.dataPath, "");
            var o = AssetDatabase.LoadMainAssetAtPath(absPath) as GameObject;
            //添加特殊点
            var p1 = o.transform.Find("EffectPoint");
            if (p1 == null)
            {
//                var op1= new GameObject("EffectPoint");
//                op1.transform.SetParent(o.transform,false);
                Debug.LogError("缺少节点 EffectPoint:" + absPath);
            }

            var p2 = o.transform.Find("AtkPoint");
            if (p2 == null)
            {
                p2 = o.transform.Find("Bip001/AtkPoint");
//                var op2= new GameObject("AtkPoint");
//                op2.transform.SetParent(o.transform,false);
                if (p2 == null)
                    Debug.LogError("缺少节点 AtkPoint:" + absPath);
            }

            var p3 = o.transform.Find("BehurtPoint");
            if (p3 == null)
            {
//                var op3= new GameObject("BehurtPoint");
//                op3.transform.SetParent(o.transform,false);
                Debug.LogError("缺少节点 BehurtPoint:" + absPath);
            }

            //添加特殊点
            var p4 = o.transform.Find("StaticPoint");
            if (p4 == null)
            {
//                var op1= new GameObject("EffectPoint");
//                op1.transform.SetParent(o.transform,false);
                Debug.LogError("缺少节点 StaticPoint:" + absPath);
            }

            var p5 = o.transform.Find("HeadPoint");
            if (p5 == null)
            {
//                var op1= new GameObject("EffectPoint");
//                op1.transform.SetParent(o.transform,false);
                Debug.LogError("缺少节点 HeadPoint:" + absPath);
            }
            else
            {
                p5.position = ,);
            }

            //删除镜头
            var cams = o.GetComponentsInChildren<Camera>();
            foreach (var c in cams)
            {
                GameObject.DestroyImmediate(c, true);
            }

            //删除animator
            var ani = o.GetComponent<Animator>();
            if (ani != null)
            {
                GameObject.DestroyImmediate(ani, true);
            }
        }

        EditorUtility.ClearProgressBar();
        AssetDatabase.SaveAssets();
        //
        AssetDatabase.Refresh();
    }

模型资源检测

    [MenuItem("Assets/自动创建角色", true)]
    static public bool CreateCharValidation()
    {
        string path = AssetDatabase.GetAssetPath(Selection.activeObject).ToLower();
        return path.EndsWith(".fbx");
    }

    [MenuItem("Assets/自动创建角色")]
    static public void CreateChar()
    {
        string path = AssetDatabase.GetAssetPath(Selection.activeObject);
        Object[] objs = AssetDatabase.LoadAllAssetsAtPath(path);
        string directory = Path.GetDirectoryName(path) + "/";
        Dictionary<string, AnimationClip> clipDict = CreateAnimClips(directory, objs);

        AnimatorController ac = CreateAnimController(directory, clipDict);
        Dictionary<string, Material> matDict = CreateMaterials(directory, objs);
        CreatePrefab(path, matDict, ac, clipDict);
    }

    private static Dictionary<string, AnimationClip> CreateAnimClips(string directory, Object[] objs)
    {
        Dictionary<string, AnimationClip> clipDict = new Dictionary<string, AnimationClip>();
        AnimationClip srcClip; //源AnimationClip
        AnimationClip newClip; //新AnimationClip
        string animationPath = "";
        foreach (Object o in objs)
        {
            if (o.GetType() == typeof(AnimationClip))
            {
                srcClip = o as AnimationClip;
                if (srcClip.name.Equals("__preview__Take 001")) continue;
                EditorUtility.DisplayProgressBar("复制动画文件", srcClip.name, 0.1f);
                newClip = new AnimationClip();
                newClip.name = srcClip.name;
                //防止动画命名出错
                if (newClip.name == "hit")
                {
                    newClip.name = "behurt";
                }

                animationPath = directory + srcClip.name + ".anim";
                if (File.Exists(animationPath))
                {
                    File.Delete(animationPath);
                }

                var setting = AnimationUtility.GetAnimationClipSettings(srcClip);
                if (srcClip.name == "idle")
                {
                    setting.loopTime = true;
                }

                AnimationUtility.SetAnimationClipSettings(newClip, setting); //设置新clip的AnimationClipSettings
                newClip.frameRate = srcClip.frameRate; //设置新clip的帧率
                EditorCurveBinding[] curveBindings = AnimationUtility.GetCurveBindings(srcClip); //获取clip的curveBinds
                ; i < curveBindings.Length; i++)
                {
                    AnimationUtility.SetEditorCurve(newClip, curveBindings[i],
                        AnimationUtility.GetEditorCurve(srcClip, curveBindings[i])); //设置新clip的curve
                }

                EditorUtility.DisplayProgressBar("复制动画文件", srcClip.name, 0.7f);
                AssetDatabase.CreateAsset(newClip,
                    animationPath); //AssetDatabase中的路径都是相对Asset的  如果指定路径已存在asset则会被删除,然后创建新的asset

                EditorUtility.DisplayProgressBar("复制动画文件", srcClip.name, 0.9f);
                clipDict.Add(newClip.name, newClip);
            }
        }

        EditorUtility.ClearProgressBar();
        AssetDatabase.SaveAssets(); //保存修改
        AssetDatabase.Refresh();
        return clipDict;
    }

    private static AnimatorController CreateAnimController(string directory, Dictionary<string, AnimationClip> clipDict)
    {
        //创建animationController文件,保存在Assets路径下
        AnimatorController animatorController =
            AnimatorController.CreateAnimatorControllerAtPath(directory + "New Animation Controller.controller");
        //得到它的Layer, 默认layer为base 你可以去拓展
        AnimatorControllerLayer layer = animatorController.layers[];
        AnimatorStateMachine sm = layer.stateMachine;

        foreach (KeyValuePair<string, AnimationClip> kv in clipDict)
        {
            //取出动画名子 添加到state里面
            AnimatorState state = sm.AddState(kv.Key);
            state.motion = kv.Value;
            //把state添加在layer里面
            sm.AddAnyStateTransition(state);
        }

        return animatorController;
    }

    private static Dictionary<string, Material> CreateMaterials(string directory, Object[] objs)
    {
        Dictionary<string, Material> dict = new Dictionary<string, Material>();
        string matPath = directory + "/Materials";
        if (Directory.Exists(matPath))
        {
            Directory.Delete(matPath, true);
            AssetDatabase.Refresh();
        }

        Directory.CreateDirectory(matPath);
        foreach (Object o in objs)
        {
            if (o.GetType() == typeof(Material))
            {
                var srcMat = o as Material;
                EditorUtility.DisplayProgressBar("复制材质球", srcMat.name, 0.1f);
                var newMat = new Material(srcMat);
                newMat.name = srcMat.name;
                EditorUtility.DisplayProgressBar("复制材质球", srcMat.name, 0.7f);
                string newPath = matPath + "/" + newMat.name + ".mat";
                AssetDatabase.CreateAsset(newMat, newPath);
                EditorUtility.DisplayProgressBar("复制材质球", srcMat.name, 0.9f);
                dict.Add(newMat.name, newMat);
            }
        }

        EditorUtility.ClearProgressBar();
        AssetDatabase.SaveAssets(); //保存修改
        AssetDatabase.Refresh();
        return dict;
    }

    private static void CreatePrefab(string path, Dictionary<string, Material> matDict,
        AnimatorController ac, Dictionary<string, AnimationClip> clipDict)
    {
        var charPath = Application.dataPath + "/Resource/Runtime/Char/";
        int count = Directory.GetFiles(charPath, "*.prefab", SearchOption.TopDirectoryOnly).Length;
        count++;

        var o = AssetDatabase.LoadMainAssetAtPath(path) as GameObject;
        GameObject go = GameObject.Instantiate(o);
        //1.设置prefab的name
        go.name = count >  ? count + " + count;
        //2,设置特殊点
        GameObject point = new GameObject("EffectPoint");
        point.transform.SetParent(go.transform, false);
        point = new GameObject("BehurtPoint");
        point.transform.SetParent(go.transform, false);
        point = new GameObject("StaticPoint");
        point.transform.SetParent(go.transform, false);
        point = new GameObject("AtkPoint");
        point.transform.SetParent(go.transform, false);
        point = new GameObject("HeadPoint");
        point.transform.position = ,);
        point.transform.SetParent(go.transform, false);
        //3.设置材质球
        Renderer[] renders = go.GetComponentsInChildren<Renderer>();
        foreach (var render in renders)
        {
            int cnt = render.sharedMaterials.Length;
            Material[] matArr = new Material[cnt];
            ; i < cnt; i++)
            {
                Material oldMat = render.sharedMaterials[i];
                Material newMatPath;
                if (matDict.TryGetValue(oldMat.name, out newMatPath))
                {
                    matArr[i] = newMatPath;
                }
                else
                {
                    //一般不会走进来
                    matArr[i] = null;
                }
            }

            render.sharedMaterials = matArr;
        }

        //4.animator controller 操作
        Animator animator = go.GetComponent<Animator>();
        if (animator == null)
        {
            animator = go.AddComponent<Animator>();
        }

        RuntimeAnimatorController runAnim =
            AssetDatabase.LoadAssetAtPath<RuntimeAnimatorController>(AssetDatabase.GetAssetPath(ac));
        animator.runtimeAnimatorController = runAnim;
        AniPlayer aniPlayer = go.gameObject.AddComponent<FB.PosePlus.AniPlayer>();
        animator.enabled = false;
        aniPlayer.Clips = null;
        foreach (var c in clipDict.Values)
        {
            CloneAni(animator, c, c.frameRate);
        }

        //5.创建 skill相关
        SkillPlayer_TBS skilltbs = go.GetComponent<SkillPlayer_TBS>();
        if (skilltbs == null)
        {
            skilltbs = go.AddComponent<SkillPlayer_TBS>();
        }

        G_Skill _s = new G_Skill();
        string directory = System.IO.Path.GetDirectoryName(path);
        string outpath = directory + "/" + skilltbs.name + ".Skills.txt";
        File.WriteAllText(outpath, JsonMapper.ToJson(_s));
        AssetDatabase.Refresh();
        var src = AssetDatabase.LoadAssetAtPath<TextAsset>(outpath);
        skilltbs.SkillText = src;
        AssetDatabase.SaveAssets();
        PrefabUtility.SaveAsPrefabAsset(go, "Assets/Resource/Runtime/Char/"+go.name+".prefab");
        GameObject.DestroyImmediate(go);
    }

    static void CloneAni(Animator target, AnimationClip clip, float fps)
    {
        var ani = target;

        //创建CleanData.Ani
        FB.PosePlus.AniClip _clip = ScriptableObject.CreateInstance<FB.PosePlus.AniClip>();
        _clip.boneinfo = new List<string>(); //也增加了每个动画中的boneinfo信息.

        //这里重新检查动画曲线,找出动画中涉及的Transform部分,更精确
        List<Transform> cdpath = new List<Transform>();
        AnimationClipCurveData[] curveDatas = AnimationUtility.GetAllCurves(clip, true);
        foreach (var dd in curveDatas)
        {
            Transform tran = ani.transform.Find(dd.path);
            if (cdpath.Contains(tran) == false)
            {
                _clip.boneinfo.Add(dd.path);
                cdpath.Add(tran);
            }
        }

        Debug.LogWarning("curve got path =" + cdpath.Count);

        string path = System.IO.Path.GetDirectoryName(AssetDatabase.GetAssetPath(clip.GetInstanceID()));
        _clip.name = clip.name;
        _clip.frames = new List<FB.PosePlus.Frame>();

        _clip.loop = clip.isLooping;
        float flen = (clip.length * fps);
        int framecount = (int) flen;
        if (flen - framecount > 0.0001) framecount++;
        //if (framecount < 1) framecount = 1;

        framecount += ;
        FB.PosePlus.Frame last = null;

        //ani.StartPlayback();
        //逐帧复制
        //ani.Play(_clip.name, 0, 0);
        ; i < framecount; i++)
        {
            ani.Play(_clip.name, , (i * 1.0f / fps) / clip.length);
            ani.Update();

            last = new FB.PosePlus.Frame(last, i, cdpath);
            _clip.frames.Add(last);
        }

        if (_clip.loop)
        {
            _clip.frames[].LinkLoop(last);
        }

        Debug.Log("FrameCount." + framecount);

        FB.PosePlus.AniPlayer con = ani.GetComponent<FB.PosePlus.AniPlayer>();

        List<FB.PosePlus.AniClip> clips = null;
        if (con.Clips != null)
        {
            clips = new List<FB.PosePlus.AniClip>(con.Clips);
        }
        else
        {
            clips = new List<FB.PosePlus.AniClip>();
        }

        foreach (var c in clips)
        {
            if (c.name == _clip.name + ".FBAni")
            {
                clips.Remove(c);
                break;
            }
        }

        //ani.StopPlayback();
        string outpath = path + "/" + clip.name + ".FBAni.asset";
        AssetDatabase.CreateAsset(_clip, outpath);
        var src = AssetDatabase.LoadAssetAtPath(outpath, typeof(FB.PosePlus.AniClip)) as FB.PosePlus.AniClip;

        //设置clip

        //FB.CleanData.AniController con = ani.GetComponent<FB.CleanData.AniController>();

        clips.Add(src);
        con.Clips = clips;
    }

自动创建角色

https://github.com/blueberryzzz/ReferenceFinder

    

BDFramework.Core 学习的更多相关文章

  1. EntityFramework Core 学习系列(一)Creating Model

    EntityFramework Core 学习系列(一)Creating Model Getting Started 使用Command Line 来添加 Package  dotnet add pa ...

  2. ASP.NET Core学习系列

    .NET Core ASP.NET Core ASP.NET Core学习之一 入门简介 ASP.NET Core学习之二 菜鸟踩坑 ASP.NET Core学习之三 NLog日志 ASP.NET C ...

  3. Nancy in .Net Core学习笔记 - 初识Nancy

    前言 去年11月份参加了青岛MVP线下活动,会上老MVP衣明志介绍了Nancy, 一直没有系统的学习一下,最近正好有空,就结合.NET Core学习总结了一下. 注: 本文中大部分内容都是对官网文档的 ...

  4. .NET CORE学习笔记系列(2)——依赖注入[7]: .NET Core DI框架[服务注册]

    原文https://www.cnblogs.com/artech/p/net-core-di-07.html 包含服务注册信息的IServiceCollection对象最终被用来创建作为DI容器的IS ...

  5. .NET CORE学习笔记系列(2)——依赖注入[6]: .NET Core DI框架[编程体验]

    原文https://www.cnblogs.com/artech/p/net-core-di-06.html 毫不夸张地说,整个ASP.NET Core框架是建立在一个依赖注入框架之上的,它在应用启动 ...

  6. .NET CORE学习笔记系列(2)——依赖注入[5]: 创建一个简易版的DI框架[下篇]

    为了让读者朋友们能够对.NET Core DI框架的实现原理具有一个深刻而认识,我们采用与之类似的设计构架了一个名为Cat的DI框架.在上篇中我们介绍了Cat的基本编程模式,接下来我们就来聊聊Cat的 ...

  7. .NET CORE学习笔记系列(2)——依赖注入[4]: 创建一个简易版的DI框架[上篇]

    原文https://www.cnblogs.com/artech/p/net-core-di-04.html 本系列文章旨在剖析.NET Core的依赖注入框架的实现原理,到目前为止我们通过三篇文章从 ...

  8. .NET CORE学习笔记系列(2)——依赖注入【3】依赖注入模式

    原文:https://www.cnblogs.com/artech/p/net-core-di-03.html IoC主要体现了这样一种设计思想:通过将一组通用流程的控制权从应用转移到框架中以实现对流 ...

  9. .NET CORE学习笔记系列(2)——依赖注入【2】基于IoC的设计模式

    原文:https://www.cnblogs.com/artech/p/net-core-di-02.html 正如我们在<控制反转>提到过的,很多人将IoC理解为一种“面向对象的设计模式 ...

随机推荐

  1. 《Java面试全解析》505道面试题详解

    <Java面试全解析>是我在 GitChat 发布的一门电子书,全书总共有 15 万字和 505 道 Java 面试题解析,目前来说应该是最实用和最全的 Java 面试题解析了. 我本人是 ...

  2. [译]发布ABP v0.19包含Angular UI选项

    发布ABP v0.19包含Angular UI选项 ABP v0.19已发布,包含解决的~90个问题和600+次提交. 新功能 Angular UI 终于,ABP有了一个SPA UI选项,使用最新的A ...

  3. CF1253E Antenna Coverage(DP)

    本题难点在正确性证明. 令 \(f_i\) 表示 \([1,i]\) 被全部覆盖的最小花费.答案为 \(f_m\). 首先发现,添加一个区间 \([0,0]\) 不会影响答案.所以 \(f_i\) 的 ...

  4. shutil模块(了解)

    目录 一.shutil模块 1.1 zipfile压缩解压缩 1.2 tarfile压缩解压缩 一.shutil模块 高级的文件.文件夹.压缩包处理模块. import shutil # shutil ...

  5. jquery延迟加载

    jquery实现图片延时加载,实现原理:不设置img的src地址,把地址存在img的alt中,当img标签出现在可视区域,alt值传给src.为避免看到替换文本alt,把字体的颜色设置为背景的颜色,如 ...

  6. Zookeeper中Watcher监听实现增删改

    8.1 连接方法 package com.zookeeper.day01; import org.apache.zookeeper.*; import java.io.IOException; pub ...

  7. Vs Code 2019软件安装教程及常用的入门设置

    小编认为VsCode是一款非常好用的编辑器,插件丰富,支持的语言种类非常多.我所使用VsCode主要打一些前端的代码,自己感觉very good. 点击运行. 按图所示操作. 安装教程很简单的,主要是 ...

  8. 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 5

    18.5  使用PDO对象 PDO扩展类库为PHP访问数据库定义了一个轻量级.一致性的接口,它提供了一个数据访问抽象层,这样,无论使用什么数据库,都可以通过一致的函数执行查询和获取数据,大大简化了数据 ...

  9. IT兄弟连 Java语法教程 数组 数组的初始化

    Java语言中数组必须先初始化,然后才可以使用.所谓初始化,就是为数组的数组元素分配内存空间,并为每个数组元素赋初始值. 这时有人会问,能不能只分配内存空间,不赋初始值呢?答案是肯定不行的,一旦为数组 ...

  10. java 接口中的成员变量与方法

    java接口中变量的默认修饰符为 public static final int i = 3; 相当于 public static final int i = 3; java接口中方法的默认修饰符为 ...