개발 환경:
안드로이드 스튜디오 3.5.2
Unity3d 2020.3.25f1c1
목차
5. Unity3d의 UnityPlayerActivity.java 가져오기
Android 스튜디오 섹션
1. 새 프로젝트 만들기
새 프로젝트 만들기, 빈 활동, 패키지 com.example.unity2photo
2. 새 모듈을 만들고 테스트 이름을 지정합니다.
프로젝트, 새로 만들기 - 모듈, Android 라이브러리로 전환하고 다음을 클릭합니다.
3. 기본적으로 생성된 중복 Moudle 앱 삭제
Open Module Settings에서 APP 포인트(숫자, 예, 삭제)를 선택합니다.
4. Unity3d의 classes.jar 가져오기
Unity3d 설치 경로 아래의 해당 위치:
D:\Software\Unity\2020.3.25f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Development\Classes
class.jar을 복사하여 libs 디렉토리 아래에 붙여넣고 classer.jar - Add As Library를 마우스 오른쪽 버튼으로 클릭합니다.
5. Unity3d의 UnityPlayerActivity.java 가져오기
D:\Software\Unity\2020.3.25f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\Source\com\unity3d\player
UnityPlayerActivity.java를 복사하여 src - main- java - com.example.test 아래에 붙여넣습니다.
6. MainActivity 생성
com.example.test, New –Activity – Empty Activity를 마우스 오른쪽 버튼으로 클릭합니다.
7. 자바 코드 부분
package com.example.test;
import android.Manifest;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.os.Bundle;
import com.unity3d.player.UnityPlayer;
import com.unity3d.player.unity_player.UnityPlayerActivity;
public class MainActivity extends UnityPlayerActivity{
// @Override
// protected void onCreate(Bundle savedInstanceState) {
// super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main);
// }
// @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 获取存储权限,不然的话无法获取图片
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, 100);
}
}
// unity点击按钮触发这个方法
public void startPhoto() {
Log.d("unity","打开相册");
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent, 111); // 第二个参数是请求码
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
switch (requestCode) {
case 111: // 请求码
Log.d("Unity", "相册返回");
UnityPlayer.UnitySendMessage("Main Camera", "message", parseUri(data));
Log.d("unity", parseUri(data));
break;
}
}
}
public String parseUri(Intent data) {
Uri uri = data.getData();
String imagePath;
// 第二个参数是想要获取的数据
Cursor cursor = getContentResolver()
.query(uri, new String[]{MediaStore.Images.ImageColumns.DATA},
null, null, null);
if (cursor == null) {
imagePath = uri.getPath();
} else {
cursor.moveToFirst();
// 获取数据所在的列下标
int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
imagePath = cursor.getString(index); // 获取指定列的数据
cursor.close();
}
return imagePath; // 返回图片地址
}
}
8. AndroidMainFest 구성
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.test"
android:versionCode="1"
android:versionName="1.0" >
<application>
<activity android:name="com.example.test.MainActivity" >
<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" />
</activity>
</application>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest>
9. 안드로이드 빌드 aar
10. Unity3d 가져오기
test_debug.arr을 패키징 및 빌드하고, classes.jar의 압축을 풀어 libs classes.jar를 대체한 다음 test_debug.arr로 압축합니다.
플러그인 - Android - AndroidMainfest.xml
플러그인 - Android - test_debug.arr
Unity3d 코드 부분
사진을 읽는 2가지 방법
1, UnityWebRequest 텍스처
2. 파일 스트림을 사용하여 사진 읽기
void CallAndroid()
{
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
jo.Call("startPhoto");
Debug.Log("点击按钮");
}
public void message(string str)
{
ShowImage(str);
Debug.Log("安卓传来信息:" + str);
//StartCoroutine(LoadTexturePreview("file://" + str));
}
//使用UnityWebRequestTexture读取图片
IEnumerator LoadTexturePreview(string path)
{
UnityWebRequest uwr = UnityWebRequestTexture.GetTexture(path);
yield return uwr.SendWebRequest();
Debug.Log("图片地址:" + path);
if (uwr.isNetworkError || uwr.isHttpError)
{
Debug.Log("错误" + uwr.error);
}
else
{
Texture2D texture = DownloadHandlerTexture.GetContent(uwr);
// 图片显示在按钮上
Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(.5f, .5f));
ImageView.sprite = sprite;
}
}
//使用文件流读取图片
private void ShowImage(string path)
{
FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read);
fileStream.Seek(0, SeekOrigin.Begin);
byte[] bye = new byte[fileStream.Length];
fileStream.Read(bye, 0, (int)bye.Length);
fileStream.Close();
fileStream.Dispose();
fileStream = null;
Texture2D texture = new Texture2D(100, 50);
texture.LoadImage(bye);
Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f));
ImageView.sprite = sprite;
}
최종 표시
완전한 프로젝트 소스 코드
Unity3d는 휴대폰 앨범의 전체 프로젝트 예제를 엽니다-Unity3D 문서 리소스-CSDN 다운로드
포함: Unity3d는 휴대폰 사진 앨범을 읽고, Unity는 휴대폰 카메라를 열고, 사진을 저장합니다.
확장하다
패키징 APK 오류
해결책:
build.gralde의 클래스 경로는 Android Studio의 Gradle 플러그인 버전을 나타냅니다.
'com.android.tools.build:gradle:3.5.2'
그리고 gradle-wrapper.properties의 distributionUrl은 지정된 gradle 버전입니다!
distributionUrl = https \: //services.gradle.org/distributions/gradle-5.4.1-all.zip
Gradle은 오픈 소스 자동화 빌드 도구이며 Gradle 플러그인은 Android Studio에서 Gradle을 사용하기 위해 Google에서 개발한 플러그인입니다.
참조 URL:
Unity와 Android 간의 간단한 상호 작용, Unity는 Android 사진 앨범을 열고 호출합니다(Unity2019 이후).
Unity Gradle 빌드
의도.ACTION_PICK
Intent.ACTION_PICK - 시간이 딱 맞습니다. - Blog Garden
Unity 자동 패키징 - Android Studio - build.gradle에 대한 자세한 설명