Unity 版本 2019 之后可以直接导出 unityLibrary,集成更灵活
Unity官方demo: github.com/Unity-Techn…
参考链接:
步骤1.
导入相关moudle
implementation project(path: ':unityLibrary')
implementation fileTree(dir: project(':unityLibrary').getProjectDir().toString() + ('\\libs'), include: ['*.jar'])
复制代码
广告相关.aar 可以删除
implementation(name: 'UnityAds', ext:'aar')
implementation(name: 'UnityAdsAndroidPlugin', ext:'aar')
复制代码
不删除的话要注意 unityLibrary moudle 中 aar 包丢失 ,如下解决:
参考:www.cnblogs.com/yongdaimi/p…
(1)app.gradle 中添加
repositories { flatDir { dirs 'libs','../unityLibrary/libs' }}
复制代码
(2)注意 unityLibrary 中添加 ,不然仍会报错
repositories { flatDir { dirs 'libs' }}
复制代码
步骤2.
资源文件添加,不然崩溃
<string name="game_view_content_description">Game view</string>
复制代码
步骤3.
Unity 调用 android 代码要在主线程
多进程激励视频不显示,可尝试注释掉
android:process=":Unity"
复制代码
Unity3D 界面操作
一,点击事件添加
图片可以放在Assets 下新建的 Texture 文件夹下
选中图片后进行如图设置,不然后面给 Image 添加图片会找不到
记得Apply
1.添加点击事件
直接创建Button 也可以。这里先创建Image 添加图片,然后给Image 添加Button事件
创建Image
给Image 添加图片
可以设置图片位置,大小,缩放等参数
给Image 添加 Button组件
在Assets 目录下创建 Scripts 文件夹,用于放置创建脚本文件,点击事件的方法
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BtnController : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
public void clickdBtn()//方法名自己命名
{
//调用Android中方法,也有别的方式
try
{
AndroidJavaClass jc = new AndroidJavaClass("com.company.product.OverrideUnityActivity");//Android 类路径,按照步骤1 方法集成,基本是固定的
AndroidJavaObject overrideActivity = jc.GetStatic<AndroidJavaObject>("instance");
overrideActivity.Call("btnClick");//安卓中方法
}
catch (Exception e)
{
//appendtotext("exception during showhostmainwindow");
//appendToText(e.Message);
}
}
//再Unity 中调用Android 原生 Toast
private void toastText(object str)
{
#if UNITY_ANDROID
AndroidJavaClass UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity = UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity"); ;
AndroidJavaClass Toast = new AndroidJavaClass("android.widget.Toast");
AndroidJavaObject context = currentActivity.Call<AndroidJavaObject>("getApplicationContext");
currentActivity.Call("runOnUiThread", new AndroidJavaRunnable(() => {
AndroidJavaObject javaString = new AndroidJavaObject("java.lang.String", str.ToString());
Toast.CallStatic<AndroidJavaObject>("makeText", context, javaString, Toast.GetStatic<int>("LENGTH_SHORT")).Call("show");
}
));
#endif
}
}
复制代码
选中Image 在Inspector 面板中 Button 组件中 On Click() 列表中点击 + 添加一个
将脚本挂载再控件上
再No Function 中找到脚本中点击事件方法添加
Ctrl + s 保存下
Android 中回调方法如下:
package com.company.product;
import android.os.Bundle;
import com.unity3d.player.UnityPlayerActivity;
public abstract class OverrideUnityActivity extends UnityPlayerActivity
{
public static OverrideUnityActivity instance = null;
abstract protected void clickdBtn();//按钮点击
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
instance = this;
}
@Override
protected void onDestroy() {
super.onDestroy();
instance = null;
}
}
复制代码
2.添加圆形图片
脚本代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Sprites;
using System;
//namespace Example2_1 //实现描绘圆形Image的CircleImage组件
//{
public class CircleImage : Image
{
private int segementCount; //将圆绘制成的3角块数
private int circleVertexCount; //圆顶点的数量
protected override void OnPopulateMesh(VertexHelper vertexHelper)
{
segementCount = 100;
circleVertexCount = segementCount + 2; //渲染圆所需要的顶点数
//重写后先将之前的vertexHelper存入的顶点信息和3角面信息清除
vertexHelper.Clear();
float width = rectTransform.rect.width;
float height = rectTransform.rect.height;
Vector4 uv = (overrideSprite != null) ? DataUtility.GetOuterUV(overrideSprite) : Vector4.zero;
//利用当前UV坐标计算出uvCenter的坐标(uvCenterX,uvCenterY)
float uvCenterX = (uv.x + uv.z) * 0.5f;
float uvCenterY = (uv.y + uv.w) * 0.5f;
//利用当前Image的宽高和UV宽高计算出 X,Y轴上的UV转换系数(uvScaleX,uvScaleY)(每1单位的position所占的uv值)
float uvScaleX = (uv.z - uv.x) / width;
float uvScaleY = (uv.w - uv.y) / height;
//求每一块段区域所占圆的弧度(radian)与绘制的圆的半径(radius)
float radian = 2 * Mathf.PI / segementCount;
float radius = rectTransform.pivot.x * width;
//创建圆心顶点,并给出Position,color,uv0坐标
UIVertex centerVertex = new UIVertex();
centerVertex.position = Vector2.zero; //这个坐标主要用于作为其他顶点的坐标参照。
centerVertex.color = color;
centerVertex.uv0 = new Vector2(uvCenterX, uvCenterY);
vertexHelper.AddVert(centerVertex);
float curRadian = 0; //记作当前弧度,并添加其余圆弧上的顶点
for (int i = 0; i < circleVertexCount - 1; i++)
{
UIVertex vertex = new UIVertex();
float x = Mathf.Cos(curRadian) * radius;
float y = Mathf.Sin(curRadian) * radius;
vertex.position = new Vector2(centerVertex.position.x + x, centerVertex.position.y + y);
vertex.color = color;
vertex.uv0 = new Vector2(x * uvScaleX + uvCenterX, y * uvScaleY + uvCenterY); //与uvCenter的uv偏移量+uvCenter
vertexHelper.AddVert(vertex);
curRadian += radian;
}
//vertexHelper添加3角面信息,在渲染流程中,以3个顶点顺时针添加的面渲染,3个顶点逆时针添加的面不渲染
for (int i = 1; i < circleVertexCount - 1; i++)
{
vertexHelper.AddTriangle(i, 0, i + 1);
}
}
}
//}
复制代码
创建一个空对象
然后将脚本CircleImage 拖上去就行。和Image 一样添加图片
二,给对象添加TAG
类似参考 jingyan.baidu.com/article/fdf…
用于获取到TAG 对应的对象
public GameObject suspensionAwardPanel = GameObject.FindGameObjectsWithTag("tag名称")[0];
复制代码
三 ,调用别的脚本方法
如要在Collider中调用GM中的vibrate()方法
public class GM : MonoBehaviour
{
//是否震动 1,默认震动
public bool vibrate()
{
bool vibrate = PlayerPrefs.GetInt("vibrate", 1) == 1;
return vibrate;
}
}
public class Collider : MonoBehaviour
{
//是否震动 1,默认震动
public bool vibrate()
{
return GameObject.FindGameObjectsWithTag("InnerBox")[0].GetComponent<GM>().vibrate();
}
}
复制代码
四,数据存储
PlayerPrefs.SetInt("vibrate", 0);//存数据
bool vibrate = PlayerPrefs.GetInt("vibrate", 1) == 1;//取数据
复制代码