Android 项目 集成Unity3D

·  阅读 1335
Android 项目 集成Unity3D

Unity 版本 2019 之后可以直接导出 unityLibrary,集成更灵活

Unity官方demo: github.com/Unity-Techn…

参考链接:

www.cnblogs.com/zhxmdefj/p/…

blog.csdn.net/qq_40028144…

步骤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;//取数据
复制代码
分类:
Android
标签:
分类:
Android
标签:
收藏成功!
已添加到「」, 点击更改