最近的项目中,由于Android中集成了Unity场景,每次进入打包好的Unity项目时都会出现Unity的标志性动画,让用户处于等待状态,体验感比较差;于是便在产品经理的要求下将Unity的启动Logo换成公司的宣传动画
目前的解决办法有两种:
今天给大家分享一下第二种解决方案,我是将Unity与Android的交互先写好,然后再把Unity打包成Android项目嵌入到主Android项目中
替换Unity启动画面的Logo
Unity3D:准备一个Unity空场景即可,让其通知Android端替换Logo
AndroidStudio:替换启动动画的逻辑便写在此处
打开Unity,创建一个新项目,如下图所示


StartPage.cs:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class StartPage : MonoBehaviour
{
private AndroidJavaClass androidJavaClass;
private AndroidJavaObject androidJavaObject;
private void Awake()
{
//当Unity的场景创建出来的时候,便通知Android端将接下来Unity启动的动画替换掉
GetAndroid();
}
public void GetAndroid()
{
if (Application.platform != RuntimePlatform.Android) //判断是否运行在Android设备中
{
return;
}
androidJavaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
//获取到正在运行的Activity
androidJavaObject = androidJavaClass.GetStatic<AndroidJavaObject>("currentActivity");
//调用Android端写好的hideSplash函数
androidJavaObject.Call("hideSplash");
}
}
点击File——>Build Settings,然后便出现如下弹窗

点击Edit——>Project Settings——>Player——>Android,如下图所示

修改打包的参数设置,如下图所示:

将我们的Unity项目打包成Android项目

打包成功后,项目文件夹大致如下,大家可以参考一下

到此为止,Unity这边的操作便已经结束了,接下来的跳过启动页面就交给Android端去做了
用Android Studio打开刚刚打包出来的Unity项目,如下图

修改AndroidManifest.xml文件,将启动配置注释掉

将Unity项目打包成 aar,操作如下图,Android中的aar对应Unity中的Package包


把我们的aar放入到相应文件夹下,并添加引用

因为我们的UnityPlayer类中有用到名为"game_view_content_description"的一串字符串,所以我们需要在string资源下添加一下,这个地方是Unity的一个坑点

这里为了图方便,就带大家直接在我们新建项目中的MainActivity中编写即可,不需要创建其他任何的类和布局文件
如下图所示,代码也给大家放后面了,可以直接复制粘贴使用,只需要修改一下照片即可,这里小编为了图方便,直接放置了一张图片,大家可以放置多张照片形成动画,其实就相当于MainActivity承载了Unity场景

MainActivity.java
package com.example.androidtest;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.widget.ImageView;
import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;
public class MainActivity extends UnityPlayerActivity {
private ImageView bg; //Unity启动画面的背景图片
private ImageView animImg; //Unity启动画面的动画图面
private AnimationDrawable frameAnim; //创建一个图片动画帧对象
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
animImg = new ImageView(UnityPlayer.currentActivity);
frameAnim = new AnimationDrawable();
//我这里只添加了一张图片,大家可以添加多张图片来制作动画
frameAnim.addFrame(getResources().getDrawable(R.drawable.yf),300);
frameAnim.setOneShot(false);
animImg.setBackground(frameAnim);
frameAnim.start();
animImg.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
mUnityPlayer.addView(animImg,displayMetrics.widthPixels,displayMetrics.heightPixels);
UnityPlayer.UnitySendMessage("Main Camera","GetA","");
}
public void hideSplash(){
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(10L);
} catch (InterruptedException e) {
e.printStackTrace();
}
runOnUiThread(new Runnable() {
@Override
public void run() {
mUnityPlayer.removeView(bg);
mUnityPlayer.removeView(animImg);
bg = null;
animImg = null;
}
});
}
}).start();
}
}
到此为此,我们就做完了,给大家看一下演示效果
替换Unity启动画面的Logo
注意:记得跑真机上才可以运行测试,因为我之前在Unity打包Android项目时,忘记勾选 x86和x86-64选项了,这两个是模拟器,勾选了才能跑在Android Studio的模拟器上
在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg
最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了
一、引擎主循环UE版本:4.27一、引擎主循环的位置:Launch.cpp:GuardedMain函数二、、GuardedMain函数执行逻辑:1、EnginePreInit:加载大多数模块int32ErrorLevel=EnginePreInit(CmdLine);PreInit模块加载顺序:模块加载过程:(1)注册模块中定义的UObject,同时为每个类构造一个类默认对象(CDO,记录类的默认状态,作为模板用于子类实例创建)(2)调用模块的StartUpModule方法2、FEngineLoop::Init()1、检查Engine的配置文件找出使用了哪一个GameEngine类(UGame
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01 客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02 数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit
目录1.AdmobSDK下载地址2.将下载好的unityPackagesdk导入到unity里编辑 3.解析依赖到项目中
Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u
两个gsub产生不同的结果。谁能解释一下为什么?代码也可在https://gist.github.com/franklsf95/6c0f8938f28706b5644d获得.ver=9999str="\tCFBundleDevelopmentRegion\n\ten\n\tCFBundleVersion\n\t0.1.190\n\tAppID\n\t000000000000000"putsstr.gsub/(CFBundleVersion\n\t.*\.).*()/,"#{$1}#{ver}#{$2}"puts'--------'putsstr.gsub/(CFBundleVersio
假设我在Store的模型中有这个非常简单的方法:defgeocode_addressloc=Store.geocode(address)self.lat=loc.latself.lng=loc.lngend如果我想编写一些不受地理编码服务影响的测试脚本,这些脚本可能已关闭、有限制或取决于我的互联网连接,我该如何模拟地理编码服务?如果我可以将地理编码对象传递到该方法中,那将很容易,但我不知道在这种情况下该怎么做。谢谢!特里斯坦 最佳答案 使用内置模拟和stub的rspecs,你可以做这样的事情:setupdo@subject=MyCl