8

Unity3D研究院之程序工程和美术工程

 3 years ago
source link: https://www.xuanyusong.com/archives/2497
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Unity3D研究院之程序工程和美术工程

雨松MOMO 【Unity杂文】 围观2610721 条评论 编辑日期:2014-04-30 字体:

         做项目的时候一般会在SVN上保存两个工程,一个是客户端工程、一个是美术工程。我先说说我是怎么样做的, 最后我再说我为什么要这样做。

1.保证资源不出问题

          如果给了美术或者策划上传资源的权限,那么很有可能他们上传了错误的资源,或者它们不小心上传了错误的资源,那么程序一更新就报错了。。有些错误往往找到最后都是资源的问题,所以我们要尽量避免出现资源错误的情况。我举个典型的例子,比如每个模型都有一个动画叫”Attack” ,那么美术写错了某一个模型的动画,一般游戏少说也有100多个模型,资源一起提交以后鬼知道那个模型的动画写错了。我现在的做法是,在美术SVN工程中,做了一个按钮专门用来检查资源,美术当把模型、动画、贴图制作完成以后,先运行一下查错工具,如果没有错误然后在上传SVN。最好不要让美术手动做Prefab,只让他们做最原始的模型、动画、贴图、根据项目的需求写工具来生成Prefab,总之就是要保证美术上传的资源一定要正确的。

         客户端工程找一个合适的时间来同步美术工程,两个工程的目录结构要完全一样。同步工程的操作让策划来完成就可以了,因为策划不仅要同步美术工程,他还需要同步数据表格。以我对策划的了解他们写错表格的可能性非常大, 举个典型的例子,比如掉落表中有一个装备的掉落,它指向装备表中的主键是100的这件装备,如果装备表中恰巧策划忘配 主键为100的这个装备。那么程序获得到这件掉落的时候必然就报错了。。。。程序里面很多问题找到最后都是因为策划表格写错了字段引起的。。所以作为程序我们一样要给策划写检查错误的工具。

          写到这里我要先声明一下,我并没有对美术和策划另眼相看。只是我觉得很多细节的东西,人脑操作肯定没有电脑操作安全,就拿表格来说吧如果是我我肯定也会写错的。既然能用工具来代替人脑来检查这是多么好的一件事情啊。 至于检查工具怎么写,这得根据你的项目而定,总之我们做程序就是要用工具来避免美术和策划犯错误。

 2.常用检查工具

同步场景

首先如果你的场景同步过来了很多Scene文件,需要在BuildSetting里面手动的Add Current进去,这样做很麻烦,不要手动,我们要自动嘿嘿。

 创建一个文件夹命名Editor,无论它的目录在哪里都可以主要叫Editor就行,把如下代码放到Editor文件夹下。

Easy.cs

using UnityEngine;
using System.Collections;
using UnityEditor;
using System.Collections.Generic;
using System.IO;
public class Easy : Editor {
[MenuItem("Tools/同步所有场景到SceneSetting文件")]
static void CheckSceneSetting()
List<string> dirs = new List<string>();
GetDirs(Application.dataPath,ref dirs);
EditorBuildSettingsScene[] newSettings = new EditorBuildSettingsScene[dirs.Count];
for(int i =0; i< newSettings.Length;i++)
newSettings[i] = new EditorBuildSettingsScene(dirs[i],true);
EditorBuildSettings.scenes = newSettings;
EditorApplication.SaveAssets();
private static void GetDirs(string dirPath, ref List<string> dirs)
foreach (string path in Directory.GetFiles(dirPath))
if(System.IO.Path.GetExtension(path) == ".unity")
dirs.Add(path.Substring(path.IndexOf("Assets/")));
if (Directory.GetDirectories(dirPath).Length > 0)
foreach (string path in Directory.GetDirectories(dirPath))
GetDirs(path,ref dirs);

Unity3D研究院之程序工程和美术工程 - 雨松MOMO程序研究院 - 2

然后点击Tool/同步所有场景到SceneSetting文件 ,程序会自动将场景中的所有.unity 的Scene文件同步在BuildSetting中。

同步资源

Unity提供了导出的功能,一般是选择一个需要导出的场景或者Prefab,然后选择Export Package.. 。我个人觉得这个东西非常难用,因为如果你的Prefab上面绑定有脚本,当你导出的时候Unity会自动关联上所有脚本,不管你用不用。。太恐怖了。。。。。 一大堆导出的文件。

Unity3D研究院之程序工程和美术工程 - 雨松MOMO程序研究院 - 3

也不是不可以用,有一个比较讨巧的方法。首先选择Prefab,然后右键Select Dependencies,这样就可以自动关联Prefab所有的文件。

关联好以后,在右键选择ExportPackage… 如下图所示,记住一定不要勾选Include dependencies 。这样因为我的Prefab只绑定了一个脚本,所以图中这里只会关联绑定的哪个脚本,别的脚步就不会被关联的。。

Unity3D研究院之程序工程和美术工程 - 雨松MOMO程序研究院 - 5

但是我觉得最好的最好还是自己写一个工具,嘿嘿。

[MenuItem("Assets/new Export Assets")]
static void Build()
if(Selection.objects == null ) return;
List<string> paths = new List<string> ();
foreach(UnityEngine.Object o in Selection.objects){
paths.Add(AssetDatabase.GetAssetPath(o));
AssetDatabase.ExportPackage(paths.ToArray(), "Assets/UnityPackage/"+Selection.objects[0].name+"andxxx.unitypackage", ExportPackageOptions.IncludeDependencies);
AssetDatabase.Refresh();
Debug.Log("Build all Done!");

选择一个或多个Prefab 或者Scene文件,然后右键选择new Export Assets ,创建一个UnityPackage的文件夹, 这样导出的.unitypackage 就会放在里面啦。

Unity3D研究院之程序工程和美术工程 - 雨松MOMO程序研究院 - 6

导出出以后,然后双击装在客户端工程里面就可以了。

回到文章的开篇,为什么要用两个工程。如果用一个工程美术和策划必须很小心很小心,比如美术要做一个很庞大的场景,可能要做一周左右,如果在一个工程下,美术没做完是不应该上传的(可能程序就会出错),但是如果不上传SVN资源又不小心弄丢了几天的工作不就白费了么。而且一旦给了美术程序的权限,那么Unity里面那么多设置的选项,美术一不小心改了,有可能就是一个bug。

 如果使用两个工程,美术可以每天都上传保证自己的工作,等整个场景都做完以后,使用检查错误的工具检查发现没有错误,此时在同步在客户端的工程中。 这样可以找一个合适的同步资源的时间点,既可以保证程序的正确,也可以保证资源的正确。

如果两个工程的目录,命名都严格按照规范,那么此法是必然可行的。

作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK