unity 3d做unity3d配置androidd游戏如何去掉unity 3d的标志

290被浏览42813分享邀请回答125 条评论分享收藏感谢收起2529 条评论分享收藏感谢收起查看更多回答程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
Unity3D研究院之Android工程的合并
Unity3D研究院之Android工程的合并
围观45536次
编辑日期: 字体:
之前QQ上有好多朋友都问过我unity做插件怎么把两个工程合并在一起。。其实很多unity开发者是没做过android和IOS源生开发的,所以在做SDK这块就有点力不从心。这两天刚好有点空我就把我合并Android工程的经验分享出来。
1.游戏包名( 类似 com.xx.xxx )
Android应用程序只能有一个包名,如果两个游戏包名一样,那么后者安装后会覆盖了前者。如下图所示,在ProjectSetting里面Bundle Identifier* 就是了。
不同渠道的包名不能相同,所以用shell自动打包的时候,可以先自动在unity里面设置你的游戏包名。这个游戏包名特别容易和你自己写的java.class混淆或者和sdk的包名混淆。。
2.Activity和View是啥区别?
这就要从游戏开发和软件开发的区别说起了。软件开发中每个界面就是一个Activity。比如我们玩的微博、微信一类的软件、每当你点击某个按钮切换界面的时候,其实就是新开了一个Activity,界面上的按钮啊 图标、输入框等等、所有显示单位都是一个View。一个软件程序随随便便10几20个Activity,每一个Activity上面会放很多不同的view。
而游戏开发,只有一个Activity、并且这个Activity上面只有一个View。游戏中的所有控件都是靠我们自己用代码来写成的。自己写的肯定没有源生的效果好了,举个例子你会发现为软件程序的列表滚动要比游戏里的列表滚动舒服很多,呵呵。
3.MainActivity
每个Android应用程序都需要一个启动的Activity。也就是在手机里你点了一个游戏的icon这时候打开游戏,弹出的第一个Activity。
123456789101112131415161718
&?xml version="1.0" encoding="utf-8"?&&manifest xmlns:android="/apk/res/android"&&&&package="com.yusong.momo" &&&&&&&application&&&&&&&&android:allowBackup="true"&&&&&&&&android:icon="@drawable/ic_launcher"&&&&&&&&android:label="@string/app_name" &&&&&&&&&&activity&&&&&&&&&&&&android:name="com.yusong.momo.MainActivity"&&&&&&&&&&&&android:label="@string/app_name" &&&&&&&&&&&&&&intent-filter&&&&&&&&&&&&&&&&&&action android:name="android.intent.action.MAIN" /&&&&&&&&&&&&&&&&&&category android:name="android.intent.category.LAUNCHER" /&&&&&&&&&&&&&&/intent-filter&&&&&&&&&&/activity&&&&&&/application&&/manifest&
package:就是包名前面我们说了android每个应用程序有且只能有一个包名。
每一个Activity都要在“&activity /activity& ”中间预先声明。还要设置一个MainActivity,因为我们就一个Activity所以这里就设置它为MainActivity,也就是下面这两句。
&intent-filter&
&action android:name=”android.intent.action.MAIN” /&
//表示该Activity是MainActivity。
&category android:name=”android.intent.category.LAUNCHER” /&//表示在手机上点击游戏图标弹出该Activity
&/intent-filter&
如果你有两个MinActivity就必须将他们合并成一个,或者只能保留一个MainActivity了。
4.MainActivity和AndroidManifest怎么写
具体可以参考unity的模板、unity.app-&显示包内容-&Contents-&PlaybackEngines-&AndroidPlayer
AndroidManifest.xml
还有com/unity3d/player/ UnityPlayerNativeActivity.java
最好参考模板来写。
5.我有两个包怎么合并?
src下面一般是com/xxx/xxx/Mainactivity.java这样的结构。
com/xxx/xxx可以和你的游戏包名不同。
6.C#调用java
C#调用Activtiy.游戏只有一个Activity不存在多个。就算项目真有多个activity,一旦打开它会盖住你的unity的activity的。这部分逻辑可以在java部分完成。。
MainActivtiy.java里面有一个Purchase的方法,并且接收一个参数, 一般就是 int float string bool 等。
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject jo = jc.GetStatic&AndroidJavaObject&("currentActivity"); jo.Call("Purchase", productId);
C#调用静态类,静态方法。com.yusong.momo 下面放了一个staticClass的静态类。SetConfig就是它的静态方法。
AndroidJavaClass jc = new AndroidJavaClass("com.yusong.momo.staticClass");jc.CallStatic("SetConfig", id);
好了就这么多了。如果有什么意见欢迎大家在下面给我留言。。 或者有我没写到了,欢迎大家相告~~谢谢。
本文固定链接:
转载请注明:
雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!Unity3D游戏开发之“重写Unity Android Splash,实现启动无黑屏” - CSDN博客
Unity3D游戏开发之“重写Unity Android Splash,实现启动无黑屏”
转自:/thread-.html
Splash设置相信搞的朋友都知道这个东西,就是游戏启动的时候的启动画面,在unity中如果不设置splash的话我们就能够看到unity游戏启动的时候就会出现一张unity默认的带有Unity标志的splash启动页,如果我们需要换成自己的启动页就需要在打包的时候把splash设置成自己的图片。
那么Unity为什么会有启动页这么一个东西呢?
其实在我们游戏启动的时候unity或者我们自己会有一系列的资源加载或者初始化的东西,而这些操作都需要时间来完成,如果没有splash的话就会造成一种卡机的假象。当unity所有的初始化都完成并加载第一个场景完成,unity就会自动的隐藏splash。
那么可能有很多朋友就有疑问了,既然unity自带了splash的设置我们为什么还要重写splash呢?
答案:不知道大家有没有注意到,在我们启动unity游戏的时候会出现一段时间的黑屏然后才出现我们设置好的splash,如果机器配置越差,黑屏时间就越长。为了解决这个黑屏时间,我们重写了splash功能,让我们游戏一启动就出现我们的splash启动页。
接下来我们说一说重写splash的流程:
重写splash会涉及到好4个流程,1、编写JAVA层splash加载和处理代码&&2、设置Unity中的splash&&3、编写unity层隐藏splash代码&&4、splash图片资源路径设置
1、编写JAVA层splash加载和处理代码&
在这一流程中我们首先需要编写我们自己的程序启动Activity,此Activity继承UnityPlayerActivity,因为我们需要在主Activity onCreate()的时候显示我们JAVA层的splash。
再写一个专门管理splash加载、显示和隐藏的类。这个类的职责就是负责splash的加载、显示、隐藏。
在加载了splash图片新建view后我们需要把他加到Unity的View中,并且设置我们新建view的长宽为我们的Unity视图的长宽这样才能保证我们加载的splash跟unity中设置的splash一样而不会变形。
2、设置Unity中的splash
这个过程是必要的,因为unity加载第一个场景的时候是需要时间的,而这段时间unity会使用splash来进行覆盖,而且还会涉及到隐藏splash时机的。
3、编写unity层隐藏splash代码
第二点说了一下隐藏时机的问题,可能大部分人都会认为unity splash消失后才会执行启动场景中的Awake。但是我很确定的告诉你,并不是你想想的那样。
其实在Awake执行后splash才会消失,而这段时间是不可预估的,所以如果我们不设置Unity自带的splash页面就会造成我们无法知道的splash什么时候去隐藏他。
所以设置了unity的自带splash后我们就能光明正大的把隐藏的代码放到启动场景的Awake中去执行了。
4、splash图片资源路径设置
如果明白了上面的思路,那么最后一步就是设置我们的splash资源路径了。而这一步我们要设置2个地方的资源,一个是Android层加载的splash的位置,一个是Unity层设置的splash的位置。
可能你要问,unity层的splash设置不就是直接把图片拖到设置面板中么,但是这次我们不这样做,其实搞懂了unity设置的splash最后在Android包中哪个位置那么你就了解我要怎么做了。
注意:splash图片必须是png图片并且名字是splash.png
Android层的splash设置:放入Assets\Plugins\Android\res\drawable中
Unity层的splash设置:放入Assets\Plugins\Android\assets\bin\Data中,不需要再设置面板中去设置splash,所以大家明白了unity设置的splash最后就是在assets\bin\Data中。
一般Android层和unity层的splash应该是同一张图片,当然你也可以不一样。
有朋友推荐了一篇博客:http://blog.csdn.net/u/article/details/我抽空看了一下他的做法,基本的做法没有什么区别,最大的区别是我增加了一步就是设置unity的自身启屏页。我来解释一下为什么要这么做。
在上面博客的代码中我们可以看到最后他隐藏splsh的代码是在start里面Invoke(&OnFinish&, 0.5f),这就说明他延迟了0.5s来隐藏splash,但是我很明确的是他这个做法是不准确的,因为unity隐藏splash的时机是不确定的,这种做法会导致splash提前或者延后隐藏,这完全取决于机器的性能。
我的做法是在启动场景awake之前是靠Android层的splash覆盖unitysplash,Awake之后就是显示的unity自己的splash,最后隐藏是unity的自身行为,这种方式保证了unity的百分百准确隐藏splash。
实例代码:
package com.zwwx.
import com.unity3d.player.UnityP
import android.annotation.SuppressL
import android.app.A
import android.os.B
import android.widget.ImageV
import android.widget.ImageView.ScaleT
public class Splash extends SDKBase{
private ImageView bgView =
private UnityPlayer mUnityPlayer =
private static Splash mI
public static Splash getInstance() {
if (null == mInstance) {
synchronized (Splash.class) {
if (null == mInstance) {
mInstance = new Splash();
public void onCreate(Activity activity, Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(activity, savedInstanceState);
mUnityPlayer = ((ZWWXActivity)mActivity).getUnityPlayer();
onShowSplash();
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
onHideSplash();
@SuppressLint(&NewApi&)
public void onShowSplash() {
if (bgView != null)
try {Resources r = UnityPlayer.currentActivity.getResources();
bgView = new ImageView(UnityPlayer.currentActivity);
int splash_bg = r.getIdentifier(&splash&, &drawable&,
UnityPlayer.currentActivity.getPackageName());
bgView.setBackgroundResource(splash_bg);
bgView.setScaleType(ScaleType.CENTER);
mUnityPlayer.addView(bgView,r.getDisplayMetrics().widthPixels,
r.getDisplayMetrics().heightPixels);
} catch (Exception e) {
error(&[onShowSplash]&+e.toString());
public void onHideSplash() {
if(bgView == null)
UnityPlayer.currentActivity.runOnUiThread(new Runnable() {
public void run() {
mUnityPlayer.removeView(bgView);
} catch (Exception e) {
error(&[onHideSplash]&+e.toString());
本文已收录于以下专栏:
相关文章推荐
Spine Skeleton Animation(2D骨骼动画)
首先我们来看到底什么是骨骼动画:
在早期的机器上,渲染本身已经占用了很多CPU资源,因此,...
好吧,Unity启动确实比其他引擎生成的游戏包慢些。关键是你启动的时候还要等上一段时间才显示Splash那个logo图。
最近项目有个蛋疼得需求,需要在启动界面加进度帧动画。。我也是醉了。
/thread-.html
修改Unity导出Android工程启动时黑屏,启动时间过长
好吧,Unity启动确实比其他引擎生成的游戏包慢些。关键是你启动的时候还要等上一段时间才显示Splash那个logo图。
最近项目有个蛋疼得需求,需要在启动界面加进度帧动画。。我也是醉了。
今天用unity3d打包测试一下安卓程序,满怀信心的开始打包,借了朋友的魅族4pro 手机,擦,最新版呀,Android5.0系统
安装成功打开,期待中,过了半个小时(夸张一下),擦,还是黑屏,...
Unity启动确实比其他引擎生成的游戏包慢些。关键是你启动的时候还要等上一段时间才显示Splash那个logo图。
最近项目有个蛋疼得需求,需要在启动界面加进度帧动画。。我也是醉了。
刚开始的思路...
问题描述:
Unity发布安卓应用时,遇到只能添加一张SplashImage而需要适配手机及平板不同分辨率处理
解决方法:...
他的最新文章
讲师:宋宝华
讲师:何宇健
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)用户名:ma_haile
文章数:38
评论数:25
访问量:633604
注册日期:
阅读量:1297
阅读量:3317
阅读量:585281
阅读量:470944
51CTO推荐博文
& & 前面几张我们讲解了unity的基本使用, 知道了如何去建立一个简单游戏。 但这不不够, 因为这些需要给游戏添加更多的行为,这样游戏才算有血有肉 &好了不说那么多废话了 下面开始讲正题吧 &咔咔&
& & unity 支持javascript,C#, boo script 语言 &但官方推荐使用 javascript 语言, 对于初学者来说 ,最好使用javascrip 语言,因为简单 易学 ,更容易入门,到了后期推荐使用C# 因为c# &语言更贴近于面向对象的编程思想. 我们先用javascrip来学习吧
下面我们先来了解下unity 脚本的命名规范
& 变量 - 首写为小写字母.变量用来存储游戏状态中的任何信息.
& 函数 - 首写为大写字母.函数是一个代码块,在需要的时候可以被重复调用.
& 类 - 首写为大写字母.可以被认为是函数的库.
&当阅读范例时注意首写字母,将有助于你更好的理解对象之间的关系.
这一章 我们来做一个 如何使用脚本 让一个游戏组件移动的demo 通过学习这一章来让我们的游戏更加完善
新建项目 -& 场景 & 这一步可以不需要导入什么 资源包(不导入是因为在这个示例里面用不上)
新建一个项目后 默认会有一个新的场景 并且在场景里面还有一个摄像机组件
1:首先创建一个用于行走的 plane & 菜单栏 GameObject-&Create Other -&Plane
把Hierarchey&中的plane和摄像机的组件的Inspector属性的 position 的x,y,z 属性的值都设置为0 方便在编辑框编辑
2:创建一个用于移动的 cube 菜单栏 GameObject-&Create Other -&Cube
把Hierarchey中的cube组件的Inspector属性的 position 的x,y,z 属性的值都设置为0
这里如果觉得场景不好看 可以给场景的plane 和 cube添加上图片纹理,和灯光,这边不在阐述了 , 前几章有讲过,呵呵
现在我们来 开始我们第一个脚本
在Project 中点右键 create -&javascript 创建一个js 脚本 如图
重命名该js为MovePlayer.js 并双击该js unity会自己启动 MonoDevelop 编辑器并打开该js&
在脚本中 我们看到一个Update()函数 这个函数中的代码将在游戏中的每一帧调用 所以我们将移动的代码放到这个函数中
在unity 中移动一个对象需要使用 transform 来改变位置(transform 表示游戏组件本身), 那我们就需要通过transfrom的Translate函数 修改 的x,y,z 坐标, 我们先来个简单的哈 使用键盘的 a s w d 这几个键来移动箱子 看看 下面的Update函数代码
function Update(){
& transfrom.Translate(Input.GetAxis(&Horizontal&),0,Input.GetAxis(&Vertical&));
Input.GetAxis() 函数返回-1到1之间的一个值 例如 上面代码Translate函数中的第一个参数 往左移动键映射为-1 右移动键映射为1
在上面的代码中 参数0 代表着y 轴 因为我们不需要cube 上下移动
Horiaontal和Verical 为 unity 输入按键映射 这几个按键映射是 unity 默认给我们预制的 在菜单 edit-&Project Settings-&input 的inspector 窗口下面 axes 下面可以很清楚看到按键映射关系 同样你可以修改它
3: &连接脚本
&我们想移动那个游戏组件,在这里当然是cube 啦 那我们就把刚刚写的那个MovePlayer.js连接到我们要移动的那个游戏组件上 ,那这个游戏组件就拥有了这个脚本的行为了&
那如何连接呢
& 在Hierarchy 中选中想要拥有这个脚本行为的的游戏组件 然后在菜单栏中 & & & &Componect-& scripts 就可以看到你刚写的脚本文件了 如图
如上图 scripts &下面的move Player就是我们刚刚写的脚本文件了 点击它 就可以附加到 游戏组件上了 &
还有种方法是 可以直接把Project 中的Move Player脚本文件 直接选中拖到Horiaontal 下面的游戏组件上 &这种方法更方便 直观 快捷
&给游戏组件添加脚本行为后 就可以再这个游戏组件的inspector 窗口看到我们添加的脚本文件了
小提示: 上图中 右下侧那个方框内 script &后面的那个 小三角形 点击它可以选择别的脚本文件哦 &那个齿轮样的 图标可以 移除脚本文件和重置这个脚本文件的值等
到这一步 可以就可以使游戏组件 cube 动起来了 运行游戏 使用 a,d,w,s 来控制方向 看看效果吧 &但我们发现 貌似这个组件运行的太快了,那我们有办法处理吗? &当然有了 各位盆友继续往下看哈
上面我们 是 按帧数去移动 现在我们按秒去移动 即每秒移动 多少个距离
如果按这种方式去实现 &我们需要将Input.GetAxis()函数的返回值乘于Time.deltaTime 在乘于 一个移动距离 & 重新编辑MovePlayer.js
var speed=5.0;
function Update () {
var x=Input.GetAxis(&Horizontal&)*Time.deltaTime*
var z=Input.GetAxis(&Vertical&)*Time.deltaTime*
transform.Translate(x,0,z);
上面的代码就实现了 每秒 移动的多少距离 这样就和帧数无关了
保存上面代码 重新运行游戏 试试效果是不是看着顺畅很多
注意:移动的速度除了 在代码中修改, 还可以再这个脚本所连接的游戏组件的检视面板中修改 , 这就称为变量暴露 &这种方式修改会比直接在代码中修改方便的多 如下图
如何调试脚本
Log()函数允许用户向控制台发送信息
例如: &把 Debug.Log(&show cube&); 这断代码放到Update() 函数中 允许游戏就可以再 unity 的下边看到 show cube 字样 &双击字样就可以看到控制台日志了
各位童鞋 如果想了解脚本中常用的方法 可以 进入下面地址查看
&各位童鞋 这章就到这里了 & 欢迎各位大小盆友 留言讨论 &
&本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)
16:24:47 08:33:35程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
Unity3D研究院之手游开发中所有特殊的文件夹
Unity3D研究院之手游开发中所有特殊的文件夹
围观92119次
编辑日期: 字体:
这里列举出手游开发中用到了所有特殊文件夹。
Editor文件夹可以在根目录下,也可以在子目录里,只要名子叫Editor就可以。比如目录:/xxx/xxx/Editor
和 /Editor 是一样的,无论多少个叫Editor的文件夹都可以。Editor下面放的所有资源文件或者脚本文件都不会被打进发布包中,并且脚本也只能在编辑时使用。一般呢会把一些工具类的脚本放在这里,或者是一些编辑时用的DLL。 比如我们现在要做类似技能编辑器,那么编辑器的代码放在这里是再好不过了,因为实际运行时我们只需要编辑器生成的文件,而不需要编辑器的核心代码。
2.Editor Default Resources
Editor Default Resources注意中间是有空格的,它必须放在Project视图的根目录下,如果你想放在/xxx/xxx/Editor Default Resources 这样是不行的。你可以把编辑器用到的一些资源放在这里,比如图片、文本文件、等等。它和Editor文件夹一样都不会被打到最终发布包里,仅仅用于开发时使用。你可以直接通过EditorGUIUtility.Load去读取该文件夹下的资源。
TextAsset text =
EditorGUIUtility.Load("test.txt")as TextAsset;
Debug.Log(text.text);
我觉得这个文件夹其实没什么用处,如下代码所示它可以在Scene视图里给某个坐标绘制一个icon。它的好处是可以传一个Vecotor3 作为图片显示的位置。 参数2就是图片的名子,当然这个图片必须放在Gizmos文件夹下面。
&&&&void OnDrawGizmos() {&&&&&&&&Gizmos.DrawIcon(transform.position, "0.png", true);&&&&}
如果只想挂在某个游戏对象身上,那么在Inspecotr里面就可以直接设置。。
这里还是要说说OnDrawGizmos()方法,只要脚本继承了MonoBehaviour后,并且在编辑模式下就会每一帧都执行它。发布的游戏肯定就不会执行了,它只能用于在scene视图中绘制一些小物件。比如要做摄像机轨迹,那么肯定是要在Scene视图中做一个预览的线,那么用Gizmos.DrawLine 和Gizmos.DrawFrustum就再好不过了。
如果做手机游戏开发一般 andoird 或者 ios 要接一些sdk 可以把sdk依赖的库文件 放在这里,比如 .so .jar .a 文件。这样打完包以后就会自动把这些文件打在你的包中。
5.Resources
可以在根目录下,也可以在子目录里,只要名子叫Resources就可以。比如目录:/xxx/xxx/Resources
和 /Resources 是一样的,无论多少个叫Resources的文件夹都可以。Resources文件夹下的资源不管你用还是不用都会被打包进.apk或者.ipa
Resource.Load :编辑时和运行时都可以通过Resource.Load来直接读取。
Resources.LoadAssetAtPath() :它可以读取Assets目录下的任意文件夹下的资源,它可以在编辑时或者编辑器运行时用,它但是它不能在真机上用,它的路径是”Assets/xx/xx.xxx” 必须是这种路径,并且要带文件的后缀名。
AssetDatabase.LoadAssetAtPath():它可以读取Assets目录下的任意文件夹下的资源,它只能在编辑时用。它的路径是”Assets/xx/xx.xxx” 必须是这种路径,并且要带文件的后缀名。
我觉得在电脑上开发的时候尽量来用Resource.Load() 或者 Resources.LoadAssetAtPath() ,假如手机上选择一部分资源要打assetbundle,一部分资源Resource.Load().那么在做.apk或者.ipa的时候 现在都是用脚本来自动化打包,在打包之前 可以用AssetDatabase.MoveAsset()把已经打包成assetbundle的原始文件从Resources文件夹下移动出去在打包,这样打出来的运行包就不会包行多余的文件了。打完包以后再把移动出去的文件夹移动回来。
6. StreamingAssets
这个文件夹下的资源也会全都打包在.apk或者.ipa 它和Resources的区别是,Resources会压缩文件,但是它不会压缩原封不动的打包进去。并且它是一个只读的文件夹,就是程序运行时只能读 不能写。它在各个平台下的路径是不同的,不过你可以用Application.streamingAssetsPath 它会根据当前的平台选择对应的路径。
有些游戏为了让所有的资源全部使用assetbundle,会把一些初始的assetbundle放在StreamingAssets目录下,运行程序的时候在把这些assetbundle拷贝在Application.persistentDataPath目录下,如果这些assetbundle有更新的话,那么下载到新的assetbundle在把Application.persistentDataPath目录下原有的覆盖掉。
因为Application.persistentDataPath目录是应用程序的沙盒目录,所以打包之前是没有这个目录的,直到应用程序在手机上安装完毕才有这个目录。
StreamingAssets目录下的资源都是不压缩的,所以它比较大会占空间,比如你的应用装在手机上会占用100M的容量,那么你又在StreamingAssets放了一个100M的assetbundle,那么此时在装在手机上就会在200M的容量。
今天就到这里了,如果有问题欢迎大家与@雨松MOMO一起讨论。嘿嘿。
本文固定链接:
转载请注明:
雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!

我要回帖

更多关于 unity3d android 调试 的文章

 

随机推荐