区块链是一种块链式数据结构,以时间先后为基准,将存储数据的区块以顺序相连的形式相结合,同时以密码学方式确保数据的不可篡改和不可伪造,是一种安全性极高的分布式账本。广义来讲,区块链利用块链式数据结构来对数据进行验证与存储、利用分布式节点共识算法对数据进行更新、利用密码学方式确保数据的传输与访问安全、利用自动化脚本编写的智能合约来对数据进行编程和操作,是一种全新的分布式架构基础与计算方式。
Based on the traditional Internet,the metauniverse technology has put forward higher requirements in terms of immersion,participation,sustainability and other aspects,so it will be supported by many independent tools,platforms,infrastructure,protocols,etc.With the increasing maturity of AR,VR,5G,cloud computing and other technologies,the metauniverse is expected to gradually move from concept to reality.
区块链的基本特性主要体现在5个方面:
1)去中心化:以分布式网络为基础结构,对数据进行验证、记账、存储、维护和传输等操作,利用纯数学方法建立节点之间的交互信任关系,进而形成去中心化、可信任的分布式系统;
2)时序数据:块链式数据结构携带时间戳,为数据添加时间维度,使得数据能够验证与追溯;
3)集体维护:区块链系统使用特有的激励机制以保证系统中所有节点均愿意参与区块的验证,在此过程中采用共识算法选择特定节点,为区块链添加新的区块;
4)可编程:区块链技术提供灵活自由的脚本系统,可以支持用户创建多种形式的去中心化应用;
5)安全可信:以非对称密码学原理为理论基础,对数据进行单向加密,从而确保了数据的安全性;
Prefab的生成
先贴上代码:
PrefabUtility.CreatePrefab(prefabFullPath,CREATE_OBJ));
prefabFullPath的格式为保存的路径+想要保存的名字+.prefab后缀名
例如:application.datapath+testobj+.prefab
CREATE_OBJ为你想要保存为预制体的游戏物体类
GameObject selectedGameObject=Selection.activeGameObject;
可以通过Selection方法获得Hierarchy窗口中选中的物体,
也可以通过外部传,总之这个就是你要制作成预制体的游戏物体
CreatePrefab方法返回的是一个游戏物体类
UnityPackage的导出
还是先贴代码:
string exprotPath=EditorUtility.SaveFilePanel("导出包路径","","","unitypackage");
var AssetPathName=AssetDatabase.GetDependencies(assetPath);
AssetDatabase.ExportPackage(AssetPathName,exprotPath+"bao.unitypackage",ExportPackageOptions.IncludeDependencies|ExportPackageOptions.Default);
exprotPath为想要导出的路径,此处用Unity的SaveFilePanel类,第一个string为窗口标题,第二个string为默认打开的目录,第三个string为默认文件名(在打开窗口中可以随意填写),第四个string为后缀名,拓展名,此处我们填写unitypackage
AssetPathName为一个string数组,值是想要打包的资源的路径(从Assets/开始算,即只记录工程目录即可)
如果你无法确定自己想要导出的资源在工程Assets目录下哪个位置,可以通过
var AssetPathName=new string[Selection.objects.Length];
for(int i=0;i<AssetPathName.Length;i++)
{
AssetPathName<i>=AssetDatabase.GetAssetPath(Selection.objects<i>);
}
Selection.objects就是你在Project视窗中选择的物体物体数组,然后再通过GetAssetPath方法获取到这个资源的在工程中的路径
GetAssetPath方法也可以用来获取刚刚我们创建预制体的路径
string AssetPath=AssetDatabase.GetAssetPath(PrefabUtility.SaveAsPrefabAsset(CREATE_OBJ,prefabFullPath));
这里用了新的保存预制体的方法SaveAsPrefabAssets,CreatePrefab方法在新的版本中会被弃用,这个方法的构造参数和CreatePrefab方法相反,需要生成预制体的物体在前面,路径在后面
当我们获取到这个AssetsPath之后,还需要通过AssetDatabase.GetDependencies(assetPath)方法来获取这个资源的引用关系,才能打包出一个完整的包,这里可以传string数组(获取多个物体的引用),也可以单独传一个string(获取一个物体的引用),返回的都是一个string数组,有了这个引用的数组,我们就可以导出包了
AssetDatabase.ExportPackage(AssetPathName,exprotPath,ExportPackageOptions.IncludeDependencies);
第一个值就是需要被导出的资源的路径,如果没有获取到引用,你导出的也只是一个Prefab的依赖表,不包含任何模型资源,图片,材质等资源的,第二个值就是导出路径+名字,刚刚我们已经尬通过SaveFilePanel获取到了,这里直接用就行了,第三个值是导出的模式,一共有四种模式,大家可以详细自己看一下,IncludeDependencies这个模式就是包含了引用关系的(即使你没有获取引用,也会自动去查找引用再导出)
u3d里动态创建对象,需要使用prefab
而创建的时候MonoBehaviour.Instantiate(GameObject orignal)需要一个作为原型的对象。
本文提供三种方式获得prefab对象。
方式一:使用脚本的public字段
直接在Project视图里找到做好的prefab,将其拖拽到指定脚本的指定public GameObject字段。
方式二:Resource类
1、在Assets目录下的任意位置创建一个名为resources的文件夹,将做好的prefab放到这个文件夹下,path形式如下:
Assets....resourcesprefabName.prefab
2、在代码里使用Resource.Load或LoadAll函数,获得原型对象。
指定prefab时不需要指定扩展名(.prefab),形式如下:
GameObject prototype=Resource.Load("prefabName")as GameObject;
可以有任意数量的resources文件夹,怀疑是Resource类初始化的时候会搜集所有resources文件夹里的文件名。
方式三:加载到场景
一般我们制作Perfab的时候,都是在Hierarchy视图里创建GameObject,然后再搭建Prefab。
事后根据需要删除这个原始的GameObject。
因此我们可以保留这个GameObject,然后在场景加载后Find这个对象(代码方式),或者使用脚本public字段(编辑器方式)。