用unity 开发unity android sdk手机游戏,如何决定游戏应该运行在一个怎么...

&&&&unity3d 手机PC同步调试应用,重力感应,游戏
unity3d 手机PC同步调试应用,重力感应,游戏
可以实现 手机 和 pc unity3d 同时运行 同一个项目,可以很方便的在手机上做调试,不需要编译后在运行。
把你下载的apk安装到手机上,
然后手机USB连接电脑,
然后先关掉你正在运行的unity3d,
在重新打开u3d,之后直接运行就可以看到手机和PC端显示一样的画面。
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
VIP下载&&免积分60元/年(1200次)
您可能还需要
移动开发下载排行今天看啥 热点:
Unity3D游戏开发之使用AssetBundle和Xml实现场景的动态加载,unity3dassetbundle
各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是/。
今天我想和大家聊聊在Unity3D中关于场景的动态加载的问题。众所周知在Unity3D游戏开发过程中,因为受到游戏容量、平台性能和热更新等诸多因素的限制,我们可能无法将所有的游戏场景打包到项目中然后相对”静态”地加载,那么这个时候就需要我们使用动态加载的方式来将游戏场景加载到场景中。博主在研究了Unity3D动态加载的相关资料后发现,目前Unity3D中实现动态加载场景的方式主要有以下两种方式:
* 使用BuildStreamedSceneAssetBundle()方法将场景打包为AssetBundle:这种方法将生成一个流式的.unity3d文件,从而实现按需下载和加载,因此这种方式特别适合Web环境下游戏场景的加载,因为在Web环境下我们可以希望的是玩家可以在玩游戏的同时加载游戏。可是因为这种打包方式仅仅是保证了场景中的GameObject与本地资源的引用关系而非是将本地资源打包,因此从减少游戏容量的角度来说并不是十分实用,而且当我们使用WWW下载完AssetBundle后,需要使用Application.Load()方法来加载场景,我们知道在Unity3D中加载一个关卡(场景)是需要在BuildSetting中注册关卡的,因此在使用这种方式动态加载的时候请注意到这一点。
* 将场景内的所有物体打包为AssetBundle配合相关配置文件动态生成场景:这种方法的思路是使用一个配置文件来记录下当前场景中所有物体的位置、旋转和缩放信息,然后再根据配置文件使用Instantiate方法逐个生成即可。这种思路是考虑到需要在一个场景中动态替换GameObject或者是动态生成GameObject的情形,使用这种方法首先要满足一个条件,即:场景内所有的物体都是预制件(Prefab)。这是由Unity3D的机制决定的,因为Prefab是一个模板,当你需要动态生成一个物体的时候就需要为其提供一个模板(Prefab)。
如果你对这两种方式没有什么疑问的话,那么我觉得我们可以正式开始今天的内容了。既然今天的题目已然告诉大家是使用AssetBundle和Xml文件实现场景的动态加载,我相信大家已经明白我要使用那种方式了。好了,下面我们正式开始吧!
在实现场景的动态加载前,我们首先要在本地准备好一个游戏场景,然后做两件事情:
* 将场景内的所有GameObject打包为AssetBundle
* 将场景内所有的GameObject的信息导出为Xml文件
做这两件事情的时候,相当于我们是在准备食材和菜谱,有了食材和菜谱我们就可以烹制出美味佳肴了。可是在做着两件事情前,我们还有一件更为重要的事情要做,那就是我们需要将场景中使用到的GameObject制作成预制体(Prefab)。因为在博主的印象中,Unity3D打包的最小粒度应该是Prefab,所以为了保险起见,我还是建议大家将场景中使用到的GameObject制作成预制体(Prefab)。那么问题来了,当我们将这些Prefab打包成AssetBundle后是否还需要本地的Prefab文件?这里博主一直迷惑,因为理论上当我们将这些Prefab打包成AssetBundle后,我们实例化一个物体的时候实际上是在使用AssetBundle的Load方法来获取该物体的一个模板,这个模板应该是存储在AssetBundle中的啊!因为我的笔记本使用的是免费版的Unity3D无法对此进行测试,所以如果想知道这个问题结果的朋友可以等我下周到公司以后测试了再做讨论(我不会告诉你公司无耻地使用了破解版),当然如果有知道这个问题的答案的朋友欢迎给我留言啊,哈哈!这里就是想告诉大家要准备好场景中物体的预设体(Prefab),重要的事情说三遍!!!
将场景内物体打包为AssetBundle
Unity3D打包的相关内容这里就不展开说了,因为在官方API文档中都能找到详细的说明,虽然说Unity5.0中AssetBundle打包的方式发生了变化,不过考虑到大家都还在使用4.X的版本,所以等以后我用上了Unity5.0再说吧,哈哈!好了,下面直接给出代码:
[MenuItem("Export/ExportTotal----对物体整体打包")]
static void ExportAll()
string savePath=EditorUtility.SaveFilePanel("输出为AssetBundle","","New Resource","unity3d");
if(string.IsNullOrEmpty(savePath)) return;
Object[] objs=Selection.GetFiltered(typeof(Object),SelectionMode.DeepAssets);
if(objs.Length&0) return;
BuildPipeline.BuildAssetBundle(null,objs,savePath,BuildAssetBundleOptions.pleteAssets);
AssetDatabase.Refresh();
将场景内物体信息导出为Xml文件
导出场景内物体信息需要遍历场景中的每个游戏物体,因为我们在制作场景的时候通常会用一个空的GameObject作为父物体来组织场景中的各种物体,因此我们在导出Xml文件的时候仅仅考虑导出这些父物体,因为如果考虑子物体的话,可能会涉及到递归,整个问题将变得特别复杂。为了简化问题,我们这里仅仅考虑场景中的父物体。好了,开始写代码:
[MenuItem("Export/ExportScene----将当前场景导出为Xml")]
static void ExportGameObjects()
//获取当前场景完整路径
string scenePath=EditorApplication.currentScene
//获取当前场景名称
string sceneName=scenePath.Substring(scenePath.LastIndexOf("/")+1,scenePath.Length-scenePath.LastIndexOf("/")-1)
sceneName=sceneName.Substring(0,sceneName.LastIndexOf("."))
//获取保存路径
string savePath=EditorUtility.SaveFilePanel("输出场景内物体","",sceneName,"xml")
//创建Xml文件
XmlDocument xmlDoc=new XmlDocument()
//创建根节点
XmlElement scene=xmlDoc.CreateElement("Scene")
scene.SetAttribute("Name",sceneName)
scene.SetAttribute("Asset",scenePath)
xmlDoc.AppendChild(scene)
//遍历场景中的所有物体
foreach(GameObject go in Object.FindObjectsOfType(typeof(GameObject)))
//仅导出场景中的父物体
if(go.transform.parent==null)
//创建每个物体
XmlElement gameObject=xmlDoc.CreateElement("GameObject")
gameObject.SetAttribute("Name",go.name)
gameObject.SetAttribute("Asset","Prefabs/"+ go.name + ".prefab")
//创建Transform
XmlElement transform=xmlDoc.CreateElement("Transform")
transform.SetAttribute("x",go.transform.position.x.ToString())
transform.SetAttribute("y",go.transform.position.y.ToString())
transform.SetAttribute("z",go.transform.position.z.ToString())
gameObject.AppendChild(transform)
//创建Rotation
XmlElement rotation=xmlDoc.CreateElement("Rotation")
rotation.SetAttribute("x",go.transform.eulerAngles.x.ToString())
rotation.SetAttribute("y",go.transform.eulerAngles.y.ToString())
rotation.SetAttribute("z",go.transform.eulerAngles.z.ToString())
gameObject.AppendChild(rotation)
//创建Scale
XmlElement scale=xmlDoc.CreateElement("Scale")
scale.SetAttribute("x",go.transform.localScale.x.ToString())
scale.SetAttribute("y",go.transform.localScale.y.ToString())
scale.SetAttribute("z",go.transform.localScale.z.ToString())
gameObject.AppendChild(scale)
//添加物体到根节点
scene.AppendChild(gameObject)
xmlDoc.Save(savePath)
好了,在这段代码中我们以Scene作为根节点,然后以每个GameObject作为Scene的子节点,重点在Xml文件中记录了每个GameObject的名称、Prefab、坐标、旋转和缩放等信息。下面是一个导出场景的Xml文件的部分内容:
Name="DoneStealth" Asset="Assets/Done/DoneScenes/DoneStealth.unity"&
Name="char_robotGuard_002" Asset="Prefabs/char_robotGuard_002.prefab"&
x="-18.99746" y="0" z="37.2443" /&
x="0" y="0" z="0" /&
x="1" y="1" z="1" /&
Name="fx_laserFence_lasers_003" Asset="Prefabs/fx_laserFence_lasers_003.prefab"&
x="-17.90294" y="1.213998" z="24.07678" /&
x="0" y="90.00001" z="0" /&
x="1" y="1" z="3.735847" /&
Name="door_generic_slide_001" Asset="Prefabs/door_generic_slide_001.prefab"&
x="-15.91264" y="-0." z="7.006886" /&
x="0" y="90.00001" z="0" /&
x="1" y="1" z="1" /&
Name="door_generic_slide_003" Asset="Prefabs/door_generic_slide_003.prefab"&
x="-7.910765" y="-0." z="37.01304" /&
x="0" y="90.00001" z="0" /&
x="1" y="1" z="1" /&
在这里我们假设所有的Prefab是放置在Resources/Prefabs目录中的,那么此时我们便有了两种动态加载场景的方式
* 通过每个GameObject的Asset属性,配合Resources.Load()方法实现动态加载
* 通过每个GameObject的Name属性,配合AssetBundle的Load()方法实现动态加载
这两种方法大同小异,区别仅仅在于是否需要从服务器下载相关资源。因此本文的主题是使用AssetBundle和Xml实现场景的动态加载,因此,接下来我们主要以第二种方式为主,第一种方式请大家自行实现吧!
动态加载物体到场景中
首先我们来定义一个根据配置文件动态加载AssetBundle中场景的方法LoadDynamicScene
根据配置文件动态加载AssetBundle中的场景
从服务器上下载的AssetBundle文件
AssetBundle文件对应的场景配置文件
public static void LoadDynamicScene(AssetBundle bundle,string xmlFile)
XmlDocument xmlDoc=new XmlDocument();
xmlDoc.LoadXml(((TextAsset)Resources.Load(xmlFile)).text);
XmlElement root=xmlDoc.DocumentE
if(root.Name=="Scene")
XmlNodeList nodes=root.SelectNodes("/Scene/GameObject");
Vector3 position=Vector3.
Vector3 rotation=Vector3.
Vector3 scale=Vector3.
foreach(XmlElement xe1 in nodes)
foreach(XmlElement xe2 in xe1.ChildNodes)
if(xe2.Name=="Transform")
position=new Vector3(float.Parse(xe2.GetAttribute("x")),float.Parse(xe2.GetAttribute("y")),float.Parse(xe2.GetAttribute("z")));
}else if(xe2.Name=="Rotation")
rotation=new Vector3(float.Parse(xe2.GetAttribute("x")),float.Parse(xe2.GetAttribute("y")),float.Parse(xe2.GetAttribute("z")));
scale=new Vector3(float.Parse(xe2.GetAttribute("x")),float.Parse(xe2.GetAttribute("y")),float.Parse(xe2.GetAttribute("z")));
GameObject go=(GameObject)GameObject.Instantiate(bundle.Load(xe1.GetAttribute("Name")),position,Quaternion.Euler(rotation));
go.transform.localScale=
因为该方法中的AssetBundle是需要从服务器下载下来的,因此我们需要使用协程来下载AssetBundle:
IEnumerator Download()
WWW _www = new WWW ("http://localhost/DoneStealth.unity3d");
yield return _
if (string.IsNullOrEmpty (_www.error))
if(_www.assetBundle!=null)
LoadDynamicScene(_www.assetBundle,"DoneStealth.xml");
好了,现在运行程序,可以发现场景将被动态地加载到当前场景中:),哈哈
使用这种方式来加载场景主要是为了提高游戏的性能,如果存在大量重复性的场景的时候,可以使用这种方式来减小游戏的体积,可是这种方式本质上是一种用时间换效率的方式,因为在使用这种方法前,我们首先要做好游戏场景,然后再导出相关的配置文件和AssetBundle,从根本上来讲,工作量其实没有减少。
当场景导出的Xml文件中的内容较多时,建议使用内存池来管理物体的生成和销毁,因为频繁的生成和销毁是会带来较大的内存消耗的。说到这里的时候,我不得不吐槽下公司最近的项目,在将近300个场景中只有30个场景是最终发布游戏时需要打包的场景,然后剩余场景将被用来动态地加载到场景中,因为领导希望可以实现动态改变场景的目的,更为郁闷的是整个场景要高度DIY,模型要能够随用户拖拽移动、旋转,模型和材质要能够让用户自由替换。从整体上来讲,频繁地销毁和生成物体会耗费大量资源,因此如果遇到这种情况建议还是使用内存池进行管理吧!
好了,今天的内容就是这样子了,如果大家对此有什么疑问,欢迎给我留言,谢谢大家!
相关搜索:
相关阅读:
相关频道:
Android教程最近更新查看:1188|回复:1
Unity游戏接入百度移动广告教程android篇
Unity 游戏里面接入百度,admob之类的广告来增加游戏的赢利是常用的增加收入的方法之一。
下面是我通过c#的方式在unity游戏里面接入百度移动广告的过程
先下载百度移动广告SDK插件
BaiduUnityPlugin.unitypackage 是Baidu Unity 插件主文件,直接通过Unity的asset import进项目导入导unity项目中
把Baidu Unity插件添加进unity步骤如下
1. 打开Unity工程
2. 从菜单打开,Assets -& Import Package -& Custom Package.
3. 选中Unity插件文件BaiduUnityPlugin.unitypackage
4. 选择导入所有内容,把baidu unity插件内全部内容导入导unity工程
5. 确认baidudemo.cs 已经导入到项目中,如果没有,请先从上面插件中复制baidudemo.cs 到工程,并修改baidudemo.cs中的百度广告ID
6. 把baidudemo.cs 拖到main camera 或者其他常在场景中的物件上
编译运行工程项目
选择菜单File -& Build Settings 选择Android平台,选择player settings设置平台属性,然后点击build
等待一会时间后应用将被安装到链接到电脑的android设备上,点开设备就能看到广告效果
Unity 集成baidu 广告代码注解说明复制内容到剪贴板代码:& &
& & Baidu.Instance().initBaidu(&app id&, &banner id&, &institial id&, &video id&);//id is got from
& & Baidu.Instance().showBannerRelative(AdSize.Banner, AdPosition.BOTTOM_CENTER, 0);上面是在Unity android和Unity iOS游戏里面集成baidu横幅广告
AdSize.Banner表示展示的广告尺寸,AdPosition.BOTTOM_CENTER表示横幅的放置位置,AdPosition里面包含各个广告位置常量,AdSize包含各个广告尺寸常量
横幅广告相对位置
下面是所有支持的baidu横幅广告相对位置常量复制内容到剪贴板代码:& & AdPosition.TOP_LEFT
& & AdPosition.TOP_CENTER
& & AdPosition.TOP_RIGHT
& & AdPosition.MIDDLE_LEFT
& & AdPosition.MIDDLE_CENTER
& & AdPosition.MIDDLE_RIGHT
& & AdPosition.BOTTOM_LEFT
& & AdPosition.BOTTOM_CENTER
& & AdPosition.BOTTOM_RIGHT下面是在Unity应用里面集成百度广告插屏广告
下面的Unity3d里面添加baidu广告的代码复制内容到剪贴板代码:& &
& & Baidu.Instance().initBaidu(&app id&, &banner id&, &institial id&, &video id&);//id is got from
& & Baidu.Instance().loadInterstitial(); 和横幅广告不同,全屏广告需要先加载,等加载完成后在合适的时间点展示广告复制内容到剪贴板代码:& & if (Baidu.Instance().isInterstitialReady()) {
& && &Baidu.Instance().showInterstitial();
& & }百度移动广告广告事件处理
百度横幅广告和全屏广告都有差不多的广告事件,你可以在unity3d里面监听并处理所有百度移动广告事件
下面是一个处理全屏广告事件的例子,我们在收到广告的时候就展示广告复制内容到剪贴板代码:& &
& & Baidu.Instance().interstitialEventHandler += onInterstitialE
& & void onInterstitialEvent(string eventName, string msg)
& && &&&Debug.Log(&handler onBaiduEvent---& + eventName + && && + msg);
& && &&&if (eventName == BaiduEvent.onAdLoaded)
& && && && &Baidu.Instance().showInterstitial();
本帖最后由 5151bb 于
17:48 编辑
感谢楼主的分享,新学会一个知识。楼主你可以了解下keymob平台。keymob平台专业于移动应用广告的管理工具。他可以帮你管理平台,仅此之外他还可以帮你实现应用交叉推广、自主销售广告、互换广告与控制广告的内容与价格。这些都是keymob平台能够做到的。使用keymob平台也可以集成广告。如果你想了解更多Keymob的信息就请登入

我要回帖

更多关于 unity android 的文章

 

随机推荐