标签: Unity

android调用unity

上一篇说到了unity调用android,这里说说android调用unity:

可以直接看代码没有多少需要解释的:

一、先 写一个android调用unity的方法

/**
* 调用Unity的方法
*
* @param gameObjectName 调用的GameObject的名称
* @param functionName 方法名
* @param args 参数
* @return 调用是否成功
*/
boolean callUnity(String gameObjectName, String functionName, String args) {
try {
Class<?> classtype = Class.forName(“com.unity3d.player.UnityPlayer”);
Method method = classtype.getMethod(“UnitySendMessage”, String.class, String.class, String.class);
method.invoke(classtype, gameObjectName, functionName, args);
return true;
} catch (ClassNotFoundException e) {

} catch (NoSuchMethodException e) {

} catch (IllegalAccessException e) {

} catch (InvocationTargetException e) {

}
return false;
}
这里说一下“gameObjectName”这个参数,就是下图中,红色圈中的的名字,这里需要将调用的方法所在类添加到里面,名字自定义

%title插图%num

unity端调用:

Boolean bl = callUnity(“GameObject”, “AndroidCallUnity”, “来自android”);
二、unity端提供的方法:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class aarTest : MonoBehaviour
{

public void AndroidCallUnity(string msg) {

Debug.Log(“AndroidCallUnity callback onSuccess———: ” + msg);
}

}
以上就是android调用unity

 

 

-END

 

unity调用android布局

public void videoTest() {
AdType = 4;
final Activity curActivity = getDiActivity();

(new Handler(curActivity.getMainLooper())).post(new Runnable() {//只要涉及到unity UI,包括更新都需要这一句。否则出错
@SuppressLint(“ResourceType”)
public void run() {
LayoutInflater inflater = LayoutInflater.from(curActivity);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT);
lp.gravity = Gravity.CENTER;
View view = inflater.inflate(R.layout.unityvideo2, null);

videoview = view.findViewById(R.id.videoView);
mmid_layout = view.findViewById(R.id.mid_layout);
mid_ico_img = view.findViewById(R.id.mid_ico_img);
mmid_click_btn = view.findViewById(R.id.mid_click_btn);
mmid_title_txt = view.findViewById(R.id.mid_title_txt);
mmid_title_content_txt = view.findViewById(R.id.mid_title_content_txt);
mlayout_skip = view.findViewById(R.id.layout_skip);
mtv_time = view.findViewById(R.id.tv_time);
mtv_time.setText(“关闭”);

//这里就是将动态布局加入到unity中
totalViewAd = (ViewGroup) curActivity.getWindow().getDecorView();
totalViewAd.addView(view, lp);
}
android完整类:

package com.u3d.com.unityAndroid;

/**
* Created by Admin on 2020/4/9.
*/

public class Unity1Android {
public static Activity activity = null;
ViewGroup totalViewAd;
private static final String[] REQUIRED_PERMISSIONS = new String[]{
“android.permission.READ_EXTERNAL_STORAGE”,
“android.permission.WRITE_EXTERNAL_STORAGE”,
“android.permission.READ_PHONE_STATE”,
“android.permission.INTERNET”,
“android.permission.VIBRATE”
};

//视频部分
LinearLayout mmid_layout, mlayout_skip;
TextView mmid_title_txt, mmid_title_content_txt;
Button mmid_click_btn;
ImageView mid_ico_img;
VideoView videoview;
TextView mtv_time;
Context context;
videoTracerMonitorsBean;

public static Time time;
public long startTime;
Bitmap bmp;
JSONArray jsonObject_video_tracer_monitors;
String JSON;//json

/**
* 调用Unity的方法
*
* @param gameObjectName 调用的GameObject的名称
* @param functionName 方法名
* @param args 参数
* @return 调用是否成功
*/
boolean callUnity(String gameObjectName, String functionName, String args) {
try {
Class<?> classtype = Class.forName(“com.unity3d.player.UnityPlayer”);
Method method = classtype.getMethod(“UnitySendMessage”, String.class, String.class, String.class);
method.invoke(classtype, gameObjectName, functionName, args);
return true;
} catch (ClassNotFoundException e) {

} catch (NoSuchMethodException e) {

} catch (IllegalAccessException e) {

} catch (InvocationTargetException e) {

}
return false;
}

public void videoTest() {
AdType = 4;
final Activity curActivity = getDiActivity();

(new Handler(curActivity.getMainLooper())).post(new Runnable() {
@SuppressLint(“ResourceType”)
public void run() {
LayoutInflater inflater = LayoutInflater.from(curActivity);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
lp.gravity = Gravity.CENTER;
View view = inflater.inflate(R.layout.unityvideo2, null);

videoview = view.findViewById(R.id.videoView);
mmid_layout = view.findViewById(R.id.mid_layout);
mid_ico_img = view.findViewById(R.id.mid_ico_img);
mmid_click_btn = view.findViewById(R.id.mid_click_btn);
mmid_title_txt = view.findViewById(R.id.mid_title_txt);
mmid_title_content_txt = view.findViewById(R.id.mid_title_content_txt);
mlayout_skip = view.findViewById(R.id.layout_skip);
mtv_time = view.findViewById(R.id.tv_time);
mtv_time.setText(“关闭”);
// mmid_click_btn.setOnClickListener(this);
// mtv_time.setOnClickListener(this);
// videoview.setVisibility(View.GONE);
// mtv_time.setVisibility(View.GONE);

totalViewAd = (ViewGroup) curActivity.getWindow().getDecorView();
totalViewAd.addView(view, lp);

videoview.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
Log.i(“tag”, “准备完毕”);
mediaPlayer.setOnInfoListener(new MediaPlayer.OnInfoListener() {
@Override
public boolean onInfo(MediaPlayer mp, int what, int extra) {
if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START) {
// video 视屏播放的时候把背景设置为透明
videoview.setBackgroundColor(Color.TRANSPARENT);
return true;
}
return false;
}
});
}
});

videoview.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
Log.i(“tag”, “播放结束”);
// videocallback.DlgAdvEventEnd(true);
}
});
videoview.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
Log.i(“tag”, “播放出错”);
return false;
}
});

}
});

}

}
这里是unity部分:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class aarTest : MonoBehaviour
{
// Start is called before the first frame update
AndroidJavaObject m_java;
public Text text;
private void Awake()
{
m_java = new AndroidJavaObject(“com.u3d.com.unityAndroid.Views.Unity1Android”);
}
void Start()
{

}

// Update is called once per frame
void Update()
{

}

public void ArrTest5()
{
m_java = new AndroidJavaObject(“com.u3d.com.unityAndroid.Views.Unity1Android”);
text.text = “开始调用方法”;
m_java.Call(“videoTest”);
text.text += “\n 调用结束”;
}

}
下一篇说说android调用unity及android与unity接口回调通信

 

-END

 

Unity 之 导出 Android项目过程简析

在出游戏包的时候,如果需要接入sdk,一般都不会直接在unity里操作,而是导出android工程,在android工程里操作,从unity5.x开始已经支持导出android studio工程

下面是Unity导出Android项目的过程,

配置BuildSetting,选择android平台点击switch platform,如果工程较大,时间会比较长。

Build Syatem 选择Gradle,否则导出的是eclipse工程

Explort Project 选中,否则打出来就是我们常用的apk形式

%title插图%num
打包之前记得设置报名,下图框中为默认名称,不修改发布会报错。

%title插图%num
若不修改包名,报错如下:

“UnityException: Bundle Identifier has not been set up correctly”

%title插图%num

设置后,点击export进行导出就可以了

导出后的工程目录如下:

%title插图%num

这就完成了Unity对Android项目的打包。*后我们打开android studio,导入后工程如果没有报错,就可以使用了。

%title插图%num

Unity5.x的版本也支持导出Ecplise的工程文件夹,,(后来出了Android Studio…,这个选项在Unity2017版本中被取消了)

Unity打开文件夹

  现在的项目里一键打APK和打ab包后,都需要手动去打开输出目录,稍微有点烦,就加了个打包完后自动弹出输出目录功能。

        代码其实很简单:

[MenuItem(“ZP/Test”)]
public static void Test()
{
string output = @”D:/ZP/Test”;
if (!Directory.Exists(output))
{
Directory.CreateDirectory(output);
}
output = output.Replace(“/”, “\\”);
System.Diagnostics.Process.Start(“explorer.exe”, output);
}
        封装一下,就可以用到很多地方:

public static void OpenDirectory(string path)
{
if (string.IsNullOrEmpty(path)) return;

path = path.Replace(“/”, “\\”);
if (!Directory.Exists(path))
{
Debug.LogError(“No Directory: ” + path);
return;
}

System.Diagnostics.Process.Start(“explorer.exe”, path);
}
        *近在用到这个接口的时候发现不是很好用,因为会被360监听成不信任,所以改成用cmd的start命令来实现,这样每次都不会弹出是否信任Unity的界面了。

public static void OpenDirectory(string path)
{
// 新开线程防止锁死
Thread newThread = new Thread(new ParameterizedThreadStart(CmdOpenDirectory));
newThread.Start(path);
}

private static void CmdOpenDirectory(object obj)
{
Process p = new Process();
p.StartInfo.FileName = “cmd.exe”;
p.StartInfo.Arguments = “/c start ” + obj.ToString();
UnityEngine.Debug.Log(p.StartInfo.Arguments);
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;
p.Start();

p.WaitForExit();
p.Close();
}
        *近在Mac上发现没有这功能,也很烦躁,又看了下Shell,就在增加了个功能支持Mac上打开文件夹功能。

public static void OpenDirectory(string path)
{
if (string.IsNullOrEmpty(path)) return;

if (!Directory.Exists(path))
{
UnityEngine.Debug.LogError(“No Directory: ” + path);
return;
}

//Application.dataPath 只能在主线程中获取
int lastIndex = Application.dataPath.LastIndexOf(“/”);
shellPath = Application.dataPath.Substring(0, lastIndex) + “/Shell/”;

// 新开线程防止锁死
Thread newThread = new Thread(new ParameterizedThreadStart(CmdOpenDirectory));
newThread.Start(path);
}

private static void CmdOpenDirectory(object obj)
{
Process p = new Process();
#if UNITY_EDITOR_WIN
p.StartInfo.FileName = “cmd.exe”;
p.StartInfo.Arguments = “/c start ” + obj.ToString();
#elif UNITY_EDITOR_OSX
p.StartInfo.FileName = “bash”;
string shPath = shellPath + “openDir.sh”;
p.StartInfo.Arguments = shPath + ” ” + obj.ToString();
#endif
//UnityEngine.Debug.Log(p.StartInfo.Arguments);
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;
p.Start();

p.WaitForExit();
p.Close();
}
openDir.sh:

tempDirectory=$1
echo ${tempDirectory}
open ${tempDirectory}
      *近在Mac上使用的时候发现不能打开带有空格的路径,比如持久化目录,因此对sh文件稍作修改:

#!/bin/bash

tempDirectory=$*

echo “${tempDirectory}”
open “${tempDirectory}”
 

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速