Unity个人版是免费的,可以去官网下载Unity Hub再下载Unity个人版。个人版功能足以满足个人学习Unity需求,如果有商业用途最好下载专业版。需要先下载Unity Hub,以便后续下载Unity开发Android相关开发组件。
官方下载地址
通过Unity Hub新建一个空的3D工程
导入3D模型:
选择Project面板中的Assert->右键Import New Asset->选择要导入的模型文件(fbx、obj、3ds等格式皆可)。导入成功后即可将3D模型拖拽到场景中。
场景Scene操作模型
通过Tools工具栏来操作模型,快捷键对应QWERTY(游戏玩家应该很熟悉),调节到合适的位置即可,将模型拖到Camera的视角内,点击Camera可预览效果。
Unity去掉天空盒
Window->Rendering->lighting->在属性面板中选择Environment,修改Skybox Material
为None
。
首次导出Android工程会提示下载相关组件,按提示下载安装。安装成功后显示下面界面:
Unity导出Android工程需要用到Android SDK、NDK、JDK等一系列Android开发组件,可通过Unity Hub下载安装Unity版本配套的Android组件。
在Unity偏好设置Preferences
面板中,选择External Tools
可配置Android SDK、NDK、JDK的路径,最好勾选推荐的从Unity Hub下载路径以免版本不匹配导致一系列问题。
专业版可以在Build Settings->Player Settings->Player->Other Settings下的Target Architectures
选择的cpu架构,个人版只支持ARMv7(armabi-v7a)架构,导出的3D工程也只能在该架构上运行,个人版也满足正常在android设备中运行调试。
在Build Settings
中,首次导出需要切换平台Switch Platform
,切换成功后勾选Export Projec
再点击Export
即可导出Android工程。
**注意:**勾选了Development Build
,会导致Android运行的3D画面右下角出现Development Build字样。
导入前,需要把androidstudio的jdk版本修改为unity对应的版本否则报错。
以import module的方式导入Unity生成的Android工程,其中有两个module,launcher
为可运行的应用模块,unityLibrary
包含Unity相关的库。
可以在launcher
模块中开发UI界面,但如果已有应用app模块也可以参考launcher
模块配置来unityLibrary
来进行3D相关开发。
参考launcher
模块进行ndk
引用:
ndk {
abiFilters 'armeabi-v7a'
}
同时需要依赖unityLibrary
:
implementation project(':unityLibrary')
launcher模块
需要注意依赖到一个字符串game_view_content_description
,拷贝到app模块中:
<string name="game_view_content_description">Game viewstring>
如果Android打包 不想把Assets/StreamingAssets/folder1
和Assets/StreamingAssets/folder2
等打进apk里,可以在gradle中加入下面配置:
android {
...
androidResources {
ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~'
noCompress '.unity3d', '.ress', '.resource', '.obb', '.bundle', '.unityexp'
}
}
主Activity继承UnityPlayerActivity
,由于UnityPlayerActivity
实现了Unity的三方库的IUnityPlayerLifecycleEvents
接口,主app没依赖此库,因此无法直接继承。
public class UnityPlayerActivity extends Activity implements IUnityPlayerLifecycleEvents
于是需要去掉实现IUnityPlayerLifecycleEvents
,同时改为内部实现IUnityPlayerLifecycleEvents
接口
private IUnityPlayerLifecycleEvents lifecycleEvents = new IUnityPlayerLifecycleEvents() {
@Override
public void onUnityPlayerUnloaded() {
UnityPlayerActivity.this.onUnityPlayerUnloaded();
}
@Override
public void onUnityPlayerQuitted() {
UnityPlayerActivity.this.onUnityPlayerQuitted();
}
};
//改为内部实现类
mUnityPlayer = new UnityPlayer(this, lifecycleEvents);
同时UnityPlayer
类也是无法直接调用,需要在unityLibrary
模块中增加方法调用。
protected void addCustomView(View view) {
if(mUnityPlayer != null) {
mUnityPlayer.addView(view);
}
}
protected void init() {
}
增加sendUnityMessage
来调用Unity方法:
protected void sendUnityMessage(String s1, String s2, String s3) {
UnityPlayer.UnitySendMessage(s1, s2, s3);
}
这样主Activity就可以继承,如需添加自定义布局可重写init方法,再调用addCustomView
方法添加。
public class MainActivity extends UnityPlayerActivity {
@Override
protected void init() {
View view = LayoutInflater.from(this).inflate(R.layout.layout_buttons, null, false);
addCustomView(view);
}
}
unityLibrary
模块需要在AndroidManifest.xml
去掉activity声明,主Activity中需要添加一下声明:
<activity
android:name=".MainActivity"
android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density"
android:hardwareAccelerated="false"
android:launchMode="singleTask"
android:resizeableActivity="false"
android:screenOrientation="fullSensor"
android:exported="true"
android:theme="@style/UnityThemeSelector.Translucent">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
intent-filter>
<meta-data
android:name="unityplayer.UnityActivity"
android:value="true" />
<meta-data
android:name="android.notch_support"
android:value="true" />
activity>
最后运行来看下效果: