Unity3D导出Android工程(Android中应用Unity3D)

Unity下载

Unity个人版是免费的,可以去官网下载Unity Hub再下载Unity个人版。个人版功能足以满足个人学习Unity需求,如果有商业用途最好下载专业版。需要先下载Unity Hub,以便后续下载Unity开发Android相关开发组件。
官方下载地址

Unity工程

通过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

Unity导出Android工程

首次导出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中导入Unity工程

导入前,需要把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 view</string>

如果Android打包 不想把Assets/StreamingAssets/folder1Assets/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>

最后运行来看下效果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/CJohn1994/article/details/125181581