原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/youxikaifa/2019/0323/421.html
常州手机游戏开发-Unity3d挪用安卓功能
游戏开垦中举行会用到和本生组件举行彼此挪用,而挪用这项安卓体系效劳都要在AndroidManifest.xml里写入获得权力。以下例子的条件是已完毕了Unity3d和Android Studio的接互
一、挪用振动
1.写入权力
<uses-permission android:name="android.permission.VIBRATE"/>
2.写安卓代码
import com.unity3d.player.UnityPlayerActivity;
import android.os.Vibrator; //导入振动包
import android.app.Service; //导动手机运用效劳包
//继续自unity包的UnityPlayerActivity类
public class MainActivity extends UnityPlayerActivity {
public Vibrator vibrator; //证明振动器
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main); 解释掉 不显现View
}
//给U3D挪用的振动函数
public void ClickShake() {
vibrator = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE);//获得手机振动效劳
//参数是2个一组,前一个表现延缓时候,后一个表现继续时候,立时发端,继续2秒,接着延缓5秒发端,继续1秒
//自界说振动形式,-1表现只振动一次,非-1则表现指定下标发端反复振动。并不是说3便是振动3次。
vibrator.vibrate(new long[]{0, 2000,5000 ,1000}, -1);
//vibrator.hasVibrator() 能否有Vibrator
// vibrator.cancel() 闭闭振动
// vibrator.vibrate(5000) 振动5秒
}
}
3.U3D写代码挪用,挪用办法参照:Android Studio导出jar包并在Unity3d中运用。
二、挪用瓜分功效
直接写代码,能实行简略的瓜分功效,运用 shareSDK插件 能实行更丰厚的功效。
public void OnShare()
{
Intent shareInt = new Intent(Intent.ACTION_SEND); //新修发送Intent
shareInt.setType("text/plain"); //纯文本
shareInt.putExtra(Intent.EXTRA_SUBJECT, "采用瓜分办法"); // 瓜分中心
shareInt.putExtra(Intent.EXTRA_TEXT, "快来下载这款游戏和尔所有玩吧!"); // 瓜分的实质
shareInt.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//运用没挨开的话挨开一个运用,挨开了切换
shareInt = Intent.createChooser(shareInt, "瓜分啊!");//运用采用器,第二个参数是弹窗题目
startActivity(shareInt);
}
三、挪用发送短信
假如不过发送本来2行便搞定了,尔此地加了发送和接管能否胜利的回执,代码有点多了。
1.写入权力
2.写安卓代码
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.widget.Toast;
import android.app.PendingIntent;
//发送短信库
import android.telephony.SmsManager;
//继续自unity包的UnityPlayerActivity类
public class MainActivity extends UnityPlayerActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main); 解释掉 不显现View
// 备案播送 发送新闻
registerReceiver(sendMessage, new IntentFilter("SENT_SMS_ACTION"));
registerReceiver(receiver, new IntentFilter("DELIVERED_SMS_ACTION"));
}
//发送播送
private BroadcastReceiver sendMessage = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//推断短信能否发送胜利
switch (getResultCode()) {
case Activity.RESULT_OK:
Toast.makeText(context, "短信发送胜利", Toast.LENGTH_SHORT).show();
break;
default:
Toast.makeText(MainActivity.this, "短信发送波折", Toast.LENGTH_LONG).show();
break;
}
}
};
//接管播送
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//表现对于方胜利收到短信
Toast.makeText(MainActivity.this, "对于方接管胜利",Toast.LENGTH_LONG).show();
}
};
//发送短信
//参数1:收信人手机号 2:发信人手机号 3:短信实质 4:发送能否胜利的回执 5:接收能否胜利的回执
public void SMSSend(String number, String content){
Intent sentIntent = new Intent("SENT_SMS_ACTION");
PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, sentIntent, 0);
Intent deliverIntent = new Intent("DELIVERED_SMS_ACTION");
PendingIntent deliverPI = PendingIntent.getBroadcast(this, 0, deliverIntent, 0);
SmsManager sms = SmsManager.getDefault(); //获得短信管制器
sms.sendTextMessage(number, null, content, sentPI, deliverPI); //发送短信
}
四、挪用相册采用图片给U3D运用
思绪:U3D挪用安卓挨开相机,采用图片裁剪后保持,保持佳了报告U3D显现图片。
1.写入权力
2.写安卓代码
package com.zou.chongyang;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.widget.Toast;
import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
//发送短信库
//继续自unity包的UnityPlayerActivity类
public class MainActivity extends UnityPlayerActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main); 解释掉 不显现View
}
//给U3D挪用的挨开相册
public void SelectPhoto()
{
//Intent便是运用之间,运用不共Activity之间接互。
Intent getAlbum = new Intent(Intent.ACTION_GET_CONTENT); //新修Intent,让用户采用特定典型的数据,并返回该数据的URI.
getAlbum.setType("image/*"); //典型为图片
startActivityForResult(getAlbum, 108); //挪用相册,截止码108,假如有截止会返回108,这个值随意树立,只消>=0便行
}
//沉写Activity里的onActivityResult办法,这个办法和startActivityForResult是一双于涌现。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
// 用户不举行灵验的树立操纵,返回体系固定的常量RESULT_CANCELED=0
if (resultCode == RESULT_CANCELED) {
Toast.makeText(getApplication(), "不采用图片", Toast.LENGTH_LONG).show();
return;
}
switch (requestCode) {
case 108:
Toast.makeText(getApplication(), "图片采用完毕", Toast.LENGTH_LONG).show();
//裁剪图片
CropPhoto(intent.getData());//获得资材的Uri,安卓Uri通用资材标记符,表现一个图片或者视频
break;
case 109:
Toast.makeText(getApplication(), "图片裁剪完毕", Toast.LENGTH_LONG).show();
//保持图片
//大概抛出非常 十分办法IOException办法必需用Try
try {
SaveImage(intent);
}
catch (IOException e) {
e.printStackTrace();
}
break;
}
super.onActivityResult(requestCode, resultCode, intent);
}
//裁剪图片
public void CropPhoto(Uri uri) {
//挪用裁剪器
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
// 开开裁剪功效
intent.putExtra("crop", "true");
//树立宽高的比率
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
//裁剪图片宽高
intent.putExtra("outputX", 100);
intent.putExtra("outputY", 100);
//乞求返回数据
intent.putExtra("return-data", true);
startActivityForResult(intent, 109); //截止码109
}
//保持裁剪图片供U3D读取 运用 FileOutputStream 必需要逮捉和处置过失 抛出非常 十分IOException
private void SaveImage(Intent intent) throws IOException {
//获得intent传过来的数据
//Bundle类是键值对于办法,传播数据 Intent也不妨传播数据,二个辨别:intent是Bundle的封装
//Intent重要数据传播用,bundle重要存取数据用。
Bundle extras = intent.getExtras();
if (extras != null) {
//取出数据
Bitmap bitmap = extras.getParcelable("data");
//文献路途=U3D里的Application.persistentDataPath路途
File destDir = new File("/mnt/sdcard/Android/data/com.zou.chongyang/files");
//假如不这个目次,创造一个
if(!destDir.exists())
{
destDir.mkdirs();
}
//创造图片数据输入流
FileOutputStream bitmapOut = new FileOutputStream("/mnt/sdcard/Android/data/com.huan.tian/files/myCall.jpg");
//压缩图片 参数1:图片方法 参数2:压缩率100表现不压缩 参数3:写入输入流
bitmap.compress(Bitmap.CompressFormat.PNG, 100, bitmapOut);
//道输入流革新写出到磁盘
bitmapOut.flush();
//闭闭流
bitmapOut.close();
//报告U3D不妨读取图片了 参数1:U3D物体称呼 参数2:办法名 参数3:要传播的参数,此地传图片称呼
UnityPlayer.UnitySendMessage("myCall","MyCallOver","myCall.jpg");
}
}
}
3.Unity3d代码
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class androidU3D : MonoBehaviour
{
//按钮事变
public void OnSelectPhoto()
{
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); //获得unity的Java类,只可挪用固态办法,获得固态属性
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); //获得目前的Activity对于象,能挪用公然办法和公然属性
//一发端便挪用安卓采用图片
jo.Call("SelectPhoto");
}
//给安卓运用,安卓何处存完后报告U3D
void myCallOver(string str)
{
StartCoroutine(LoadTexture(str));
}
//从安卓中读取贴图
IEnumerator LoadTexture(string name)
{
string path = "file://" + Application.persistentDataPath + "/" + name;
WWW www = new WWW(path);
while (!www.isDone)
{
//不完毕什么都不干,等候
}
yield return www;
//显现贴图
GetComponent<RawImage>().texture = www.texture;
}
}
前方几个例子没什么难的,便不保持工程,末尾一个U3D和Android Studio选相片图片接互的工程鄙人面地方下载:
上篇:上一篇:常州手游开发-u3d溶解shader
下篇:下一篇:常州手游开发-Unity3d委托模式详解