2018-06-06 17:05:31 u013477973 阅读数 4306
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

在Unity3D的场景中需要漫游时,通常会使用Unity 3D的标准资源包中的Characters 资源,其中的 FirstPersonController 预制提供了完整的角色控制功能,使用起来十分方便,但是角色资源包的内容过多,比如:

在只使用第一人称预制体的情况下,许多导入的资源和代码是使用不到的,因此可以通过适当的精简,生成第一人称预制,这样再次使用的时候就无需"臃肿"的Unity 官方Characters资源包,而是自己的精简资源包。

在分析了第一人称预制体身上的核心代码 FirstPersonController后,可以看到代码中引用的其他类分别为:

  • MouseLook (获取鼠标位置输入,控制头部相机旋转)
  • FOVKick (位于Standard Assets->Utility,提供角色加速和减速时,模拟视角微小变化功能)
  • CurveControlledBob(位于Standard Assets->Utility,提供角色走动时,模拟头部相机微小周期性的抖动)
  • LerpControlledBob (位于Standard Assets->Utility,提供角色在跳起落地后,模拟头部轻微抖动功能)
  • CrossPlatfomInputManager (位于Standard Assets->CrossPlatformInput->Scripts,静态类,处理跨平台输入)

基于以上的分析,精简过程就很简单了,保留 FirstPersonController脚本以及以上引用的类,另外可以保留 跳跃,步行的音频文件 (位于Standard Assets->Characters->FirstPersonCharacter->Audio),由于CrossPlatfomInputManager中引用了Standard Assets->CrossPlatformInput下的其他类,因此保留CrossPlatformInput->Scripts整个文件夹

重新建立文件夹 FirstPersonPrefarb 将以上内容移到该文件夹内:

  • Audio下为对应保留的音频文件
  • Prefarb下为角色预制
  • Scripts下包括 FirstPersonController.cs MouseLook.cs CrossPlatformInput文件夹 Utility文件夹

CrossPlatformInput文件夹与Standard Assets->CrossPlatformInput->Scripts文件夹下的内容一致 
Utility文件加下包括:

  • CurveControlledBob.cs
  • LerpControlledBob.cs
  • FOVKick.cs

这里需要注意的是,以上保留下来的脚本更改下命名空间,区别于标准资源包的命名空间,最好是以当前脚本所在的文件夹路径作为对应命名空间,同时将预制体上的FirstPersonController.cs脚本更换成此时文件夹内的 FirstPersonController.cs 并将对应变量赋值。

这样完成后就可以将该文件夹作为资源包导出,方便以后的工程使用。比如,将刚才导出的资源包导入:

资源包的大小为220K,相比于标准资源角色包23.3M,精简了许多


2017-06-29 15:11:30 qq_35936174 阅读数 11147
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

找不到Unity5的标准资源包,细心的我会发现Unity5的安装包比Unity4.x的安装包小了很多,其实是Unity5的安装包里并不自带标准资源包的原因。
Unity5的标准资源包需要单独下载。
安装好Unity5之后,打开Assets Store,然后选择右侧的Unity Essentials选项,就可以看到标准资源包Standard Assets了;
 
Unity5下载好的资源会保存在C:\Users\系统用户名\AppData\Roaming\Unity\Asset Store-5.x下。

希望这个对你有所帮助!
2015-08-20 11:53:50 struggle_zcq 阅读数 8625
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

一、导入外部资源包

1、准备好你学要的资源包.unitypackage文件

2、开始导入资源包

3、选择你下载好的.unitypackage文件

二、导入系统自带资源包

1、Unity3D 5.0以后系统没有自带系统资源包。

2、Unity3D 5.0之前的版本

三、导出资源包

            Unity3D 资源包的导出和导入类似都在Assets菜单栏下的Export Package进行资源包的导出。在这里不过多的讲解。

四、导入3Dmax模型

            用3Dmax软件建和的模型导出.FBX文件,在Unity3D菜单栏里Assets-->Export New Asset即可导入3Dmax模型

2018-05-13 17:40:40 qq_36512517 阅读数 531
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。


/*
* <资源打包介绍>
* 首先会根据已经建好的文件进行遍历,找到所有预制物并设置AssetBundleName,因为是遍历Resources下面的文件夹,
* 所以可以将每个文件夹里的所有预制物打成一个包,然后打包到StreamingAssets 下面,并会生成一个配置文件,这个
* 配置文件是以Resources下的文件夹命名的,一个文件夹一个配置文件,方便后面的更新资源,这个配置文件是根据打包
* 好的包文件生成的,每行都记录了单个包的路径+;+.manifest文件里的crc码,当每次打包预制物有改变时,crc码会重新
* 生成,更新资源时会通过配置文件里每个包路径后面的crc码来判断这个包是否需要更新。
*
*
* 所有需要打包的预制物需要放入文件夹 AssetBundleResources/Resources 下进行打包.
* 打包出来的文件会在 Assets/StreamingAssets(没有该文件夹会自动创建) 文件夹下生成.
*
* 路径供阅读下面代码参考
* 完整的需要打包路径:Assets\AssetBundleResources\Resources\Prefad\UI\XXX.prefab
* 完整的打包好的路径(安卓):Assets\StreamingAssets\Android\resources\prefad\ui\XXX.unity3d
* 完整的配置文件路径:Assets\StreamingAssets\Android\configuration\prefad\ui.txt
*
*
* 因为unity5.X不需要我们来管理引用, 所以下面的代码大部分都是对路径和文件夹的处理,打包的代码也就两行
* 1:设置AssetBundleName
*:2:根据平台设置进行打包
*
* 该段代码打包流程
* 清除已设置的AssetBundleName -→ 找到要打包的资源并设置 AssetBundleName -→ 进行打包 -→ 创建文本并写入配置信息
*
* 调用该函数,unity会自动根据资源的标签进行打包,而且是增量打包,
* a.对于资源没有变更的bundle包,不会触发重新打包;
* b.资源没变,即使生成目录下的bundle包被删除了,unity也不会重新打包;
* c.生成目录下的bundle包对应的manifase被删了,会重新打包;
* d.可以使用BuildAssetBundleOptions.ForceRebuildAssetBundle参数触发强制重新打包。
*
*
*/
public class Builder : Editor
{

[MenuItem("打包/热更新打包")]
public static void BuildAssetBundleAll()
{
#if UNITY_ANDROID && UNITY_EDITOR
BuildResource(BuildTarget.Android);
#endif
#if UNITY_IOS && UNITY_EDITOR
BuildResource(BuildTarget.iOS);
#endif
}
/// <summary>
/// 资源打包
/// </summary>
/// <param name="target">打包平台</param>
static void BuildResource(BuildTarget target)
{
//清除所有之前设置过的AssetBundleName
ClearAssetBundlesName();
//代码中给资源设置AssetBundleName
SetAssetBundelsName(AssetPath.OriginalPath);
//因为要根据平台打包,为了方便分类,所以在Assets\StreamingAssets目录下创建一个
//以平台名字命名的文件夹来放置各平台打出来的包和其他相关的文件,以方便管理
//例如安卓平台: 处理路径为Assets\StreamingAssets\Android
string outputPath = Path.Combine(AssetPath.StreamingAssetsPath, target.ToString());
//查找Assets\StreamingAssets路径下有没有当前平台名字的文件夹,没有的话就创建
if (!Directory.Exists(outputPath))
{
Directory.CreateDirectory(outputPath);
}
//刷新
AssetDatabase.Refresh();
//根据平台设置进行打包
BuildPipeline.BuildAssetBundles(outputPath, 0, target);
AssetDatabase.Refresh();
//生成配置文档(配置文档以游戏文件夹进行分类,一个游戏文件夹一个配置文档,方便管理)
ConfigurationFiles(target);
//刷新
AssetDatabase.Refresh();
Debug.Log("打包成功!");
}
/// <summary>
/// 清除之前设置过的AssetBundleName
/// 因为只要设置过AssetBundleName就会打包,所以这里一定要清理干净,防止重复打包
/// </summary>
static void ClearAssetBundlesName()
{
string[] strArr = AssetDatabase.GetAllAssetBundleNames();
for (int i = 0; i < strArr.Length; i++)
{
AssetDatabase.RemoveAssetBundleName(strArr[i], true);
}
AssetDatabase.RemoveUnusedAssetBundleNames();
}
/// <summary>
/// 在代码中给资源设置AssetBundleName
/// </summary>
static void SetAssetBundelsName(string folderName)
{
//首先遍历需要打包的文件夹,找到所有需要打包的文件
//AssetBundleResources/Resources/Prefad/UI 因为我的要打包的文件
//都是放在Prefad下的文件夹里面也就是UI文件里所以我需要遍历到UI文件夹里面
DirectoryInfo folder = new DirectoryInfo(folderName);
FileSystemInfo[] files = folder.GetFileSystemInfos();
for (int i = 0; i < files.Length; i++)
{
if (files[i] is DirectoryInfo)
{
SetAssetBundelsName(files[i].FullName);
}
else
{
//过滤.meta文件,并给遍历到的资源设置AssetBundleName,以路径的形式命名
//这里是一个资源一个包,也可以把多个资源打一个包中
//最好是对资源进行分类,将一些有共有资源的预制物打进一个包中
if (!files[i].Name.EndsWith(AssetPath.metaSuffix))
{
//处理前的路径C:\Users\Administrator\Desktop\DynamicLoadResource\Assets\AssetBundleResources\Resources\Prefad\UI\XXX.prefab
//处理后的路径Resources/Prefad/UI/XXX.unity3d
//这个处理后的路径会拿来设置AssetBundleName
string str1 = files[i].FullName.Replace(@"\", "/");
string path = "Assets" + str1.Substring(Application.dataPath.Length);
AssetImporter ass = AssetImporter.GetAtPath(path);
string str2 = str1.Substring(Application.dataPath.Length + 1);
str2 = str2.Substring(str2.IndexOf("/") + 1);
string assetName = str2.Replace(Path.GetExtension(str2), ".unity3d");
//这里设置AssetBundleName,AssetBundleName相同的文件会打到一个包中
ass.assetBundleName = assetName;
}
}
}
}
/// <summary>
/// 生成配置文件
/// </summary>
static void ConfigurationFiles(BuildTarget target)
{
//所有配置文件的配置文件
List<string> MapConfig = new List<string>();
//查找Assets\StreamingAssets\Android 下是否有 configuration(该文件用于放置生成的配置文件)文件夹
//有的话就删掉该文件夹(把文件夹下已存在的配置文件一起删除),然后重新创建该文件夹
string str = AssetPath.StreamingAssetsPath + "/" + target.ToString() + "/" + AssetPath.ConfigurationFilesName;
if (Directory.Exists(str))
{
Directory.Delete(str, true);
}
Directory.CreateDirectory(str);
//处理包路径
string resourcesStr = AssetPath.OriginalPath.Substring(AssetPath.OriginalPath.LastIndexOf("/") + 1);
string packetPath = Application.dataPath + "/" + AssetPath.StreamingAssets + "/" + target.ToString() + "/" + resourcesStr.ToLower();
//遍历 Assets\StreamingAssets\Android\resources 下的文件夹
//因为打出来的包并没有直接放在resources下,都是放在该文件夹里面的各个文件夹下
//所以需要再遍历resources下的各个文件夹
DirectoryInfo folder = new DirectoryInfo(packetPath);
FileSystemInfo[] files = folder.GetFileSystemInfos();
for (int i = 0; i < files.Length; i++)
{
if (files[i] is DirectoryInfo)
{
string config = str + "/" + files[i].Name;
if (Directory.Exists(config))
{
Directory.Delete(config, true);
}
Directory.CreateDirectory(config);
DirectoryInfo folder1 = new DirectoryInfo(files[i].FullName);
FileSystemInfo[] files1 = folder1.GetFileSystemInfos();
for (int n = 0; n < files1.Length; n++)
{
if (files1[n] is DirectoryInfo)
{
//配表文件路径
string configurationPath = config + "/" + files1[n].Name.Replace(AssetPath.metaSuffix, "") + ".txt";
//添加配表相对路径到总配表中
MapConfig.Add(configurationPath.Remove(0, AssetPath.StreamingAssetsPath.Length + 1));
SetCon(files1[n].FullName.Replace(AssetPath.metaSuffix, ""), configurationPath);
}
}
}
}
//最后生成所有配置文件的配置文件
string MapConfigPath = AssetPath.StreamingAssetsPath + "/" + target.ToString() + "/" + IP.ResoucelsTablePath;
string mapConfigStr = "";
for (int i = 0; i < MapConfig.Count; i++)
{
mapConfigStr += MapConfig[i];
mapConfigStr += System.Environment.NewLine;
}
File.WriteAllText(MapConfigPath, mapConfigStr);
}
/// <summary>
/// 向配置文件中写入ab包路径与标识
/// </summary>
/// <param name="path"></param>
/// <param name="textPath"></param>
static void SetCon(string path, string textPath)
{
string content = "";
string[] assetPath = Directory.GetFiles(path, "*.manifest", SearchOption.AllDirectories);
for (int i = 0; i < assetPath.Length; i++)
{
content += assetPath[i].Replace(Application.dataPath.Replace("/", "\\") + "\\", "").Replace(".manifest", "").Replace(AssetPath.StreamingAssets + "\\", "");
content += ";";
content += File.ReadAllLines(assetPath[i])[1].Replace("CRC:", "").Trim();
content += System.Environment.NewLine;
}
File.WriteAllText(textPath, content.Replace('\\','/'));
}


}


public class AssetPath
{
/// <summary>
/// 需要打包的文件夹路径
/// </summary>
public static string OriginalPath = Application.dataPath + "/AssetBundleResources/Resources";
/// <summary>
/// 打包出来的文件夹路径
/// </summary>
public const string StreamingAssetsPath = @"Assets/StreamingAssets";
/// <summary>
/// 配置文件夹
/// </summary>
public const string ConfigurationFilesName = "configuration";
/// <summary>
/// 资源文件夹
/// </summary>
public const string ResourcesFilesName = "resources";
/// <summary>
/// 资源文件后缀名
/// </summary>
public const string unity3dSuffix = ".unity3d";
/// <summary>
/// .meta后缀名
/// </summary>
public const string metaSuffix = ".meta";
/// <summary>
/// 打包目录
/// </summary>
public const string StreamingAssets = "StreamingAssets";
/// <summary>
/// Android
/// </summary>
public const string _Android = "Android";
/// <summary>
/// IPhonePlayer
/// </summary>
public const string _IPhonePlayer = "IPhonePlayer";
/// <summary>
/// 移动端本地压缩包路径
/// </summary>
public static string streamingPath = Application.streamingAssetsPath + "/" + Application.platform;
/// <summary>
/// 移动端资产放置路径
/// </summary>
public static string persistentPath = Application.persistentDataPath + "/" + Application.platform;
/// <summary>
/// 预留物配表相对路径
/// </summary>
public const string scheduledFileName = "/"+ConfigurationFilesName+"/prefad/scheduled.txt";
/// <summary>
/// "jar:file"
/// </summary>
public const string jarHead = "jar:file";
/// <summary>
/// "http"
/// </summary>
public const string httpHead = "http";

/// <summary>
/// 配置物
/// </summary>
public const string source = "source";

}



2013-03-10 16:49:12 mfc11 阅读数 4454
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

1.创建资源包:

 public   class  Sript_01 : MonoBehaviour

{

          [MenuItem ("自定义资源包/创建资源包")]

          static void ExecCreateAssetBunldes()

          {

                       //设置保存资源包的根路径

                       string targetDir = Application.dataPath + "/AssetBundles";

                     Object[] SelectedAsset = Selection.GetFiltered(typeof (Object),SelectionMode.DeepAssets);

                     //创建一个目录,用于保存资源包

                     if(!Eirectory.Exists(targetDir))

                     {

                              Directory.CreateDirectory(targetDir);

                     }

                    for(int i=0;i<selectedAsset.Length;i++)

                     {

                              //生成资源包的完整路径

                              string filepath = targetDir + "/" + SelectedAsset[i].name + ".unity3d";

                               //根据路径判断资源包文件是否存在

                               if(File.Exists(filePath))

                               {

                                          File.Delete(filePath);

                             }

                             //生成新的资源包文件

                             if(BuildPipeline.BuildAssetBundle(SelectedAsset[i],null,filePath,BuildAssetBundleOptions.CollectDependencies))

                            {

                                       Debug.Log(“资源包生成成功”);

                                       AssetDatabase.Refresh();

                               }

                            else

                                      Debug.Log("资源包文件生成失败");

}

                      }

           }

}

 Note: This is an editor class. To use it you have to place your script in Assets/Editor inside your project folder. Editor classes are in the UnityEditor namespace so for C# scripts you need to add "using UnityEditor;" at the beginning of the script.

 

2.下载资源包

IEnumerator loadBundleMat(string name)

{

            Material mat;

         //资源在本机的路径

            WWW date = new WWW("file://" + Application.dataPath + "/AssetBundles/" + name + "./unity3d");

 //等待下载完成

             yield return date;

//将下载得到的资源强制转换成材质资源

               mat = (Material)date.assetBundle.mainAsset;

//更换为下载的资源

              renderer.material = mat;

//释放资源对象

                date.assetBundle.Unload(false);

}

 

IEnumerator loadBundleObject (string name)

{

      WWW date = new WWW("file://" + Application.dataPath + "AssetBundles/" + name + ".unity3d");

       //等待下载完成,并且克隆游戏对象,

       yield return Instantiate(date.assetbundle.mainAsset);

      //释放资源对象

         date.assetbundle.Unload(false);

}

注释: 资源包下载完成后,资源文件将保持在assetBundle.mainAsset 对象中,接着使用该对象即可。由于连续下载资源包对象会出错,所以下载完资源后需要手动释放对象。

 

Unity3D标准资源下载

阅读数 4282

没有更多推荐了,返回首页