2015-09-02 18:57:32 Pig_3800 阅读数 9114
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4643 人正在学习 去看看 张刚

之前苹果设备上获取唯一标识符,可以通过获取Mac地址。但是现在苹果把这条路堵死了。
不过没关系,苹果已经给出了替代方案,可以调用相应的接口,生成一串字符串,用生成的
字符串来代替之前的Mac地址。


Unity端

新建个脚本,然后绑定到一个对象上,脚本代码如下,这片代码我就不多说了,不懂得自己
去看下IOS和Unity的互调。弄完后导出IOS工程。

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using System.Runtime.InteropServices;//Must be Defined

public class GetIdentertyControl : MonoBehaviour {

    // Use this for initialization
    public Text IDFA;
    public Text Verdorid;

    [DllImport("__Internal")]
    private static extern void _GetIDFA ();

    public void GetIDFA(string str){
        if (string.IsNullOrEmpty(str)) {
            Debug.Log("IDFA is NULL");
            return;
        }
        IDFA.text = str;
    }

    [DllImport("__Internal")]
    private static extern void _GetVerdorid ();

    public void GetVerdorid(string str){
        if (string.IsNullOrEmpty(str)) {
            Debug.Log("Verdorid is NULL");
            return;
        }
        Verdorid.text = str;
    }
    public void OnClickButton(){
        if(Application.platform != RuntimePlatform.OSXEditor){
            _GetVerdorid();
            _GetIDFA();
            _GetDevName();
            _GetImage();
        }
    }
}

IOS端

  • 先新建个OC的类吧,然后把官方的KeychainItemWrapper代码拷贝进去吧。然后你
    会发现,报错了..这个是因为我们导出的工程默认是使用ARC的,但是官方的这个是不
    使用的。你可以自己根据提示慢慢改也可也使用我弄好的KeychainItemWrapper直接
    导入你工程就好了。(PS:赚点积分)
  • 导入两个包
    这里写图片描述
    然后再新建一个类,来使用之前导入的KeychainItemWrapper,代码如下:
#import "UUID.h"
#import "KeychainItemWrapper.h"

#define APP_IDENTIFIER @"*****************"//这里填你开发者账号的Team

@implementation UUID

+ (NSString*) uuid {

    CFUUIDRef puuid = CFUUIDCreate( nil );
    CFStringRef uuidString = CFUUIDCreateString( nil, puuid );
    NSString * result = (NSString *)CFBridgingRelease(CFStringCreateCopy( NULL, uuidString));
    CFRelease(puuid);
    CFRelease(uuidString);

    return result;
}


+ (void) saveToKeyChain {

    NSString *uuid = [self uuid];

    KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:APP_IDENTIFIER accessGroup:nil];

    [wrapper setObject:uuid forKey:(__bridge id)kSecValueData];


}

+ (NSString*) getUUIDFromKeyChain {
    KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:APP_IDENTIFIER accessGroup:nil];

    NSString *password = [wrapper objectForKey:(__bridge id)kSecValueData];
    return password;
}

@end
  • 再新建个类,这个类就是和Unity进行消息互换的。
    代码如下:
#import "InteractiveToUnity.h"
#import "GetImage.h"
#import "UUID.h"
#import <AdSupport/AdSupport.h>

@implementation InteractiveToUnity

void _GetIDFA (){
    const char* gameObject = "GetIdenterty";
    const char* functionname = "GetIDFA";
    NSString *str = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
    UnitySendMessage(gameObject, functionname, [str UTF8String]);
};
void _GetVerdorid (){
    const char* gameObject = "GetIdenterty";
    const char* functionname = "GetVerdorid";
    NSString *str=[UUID getUUIDFromKeyChain];
    if(str == nil || [str  isEqual: @""]){
        [UUID saveToKeyChain];
        str = [UUID getUUIDFromKeyChain];
    }
    UnitySendMessage(gameObject, functionname, [str UTF8String]);
};
@end

简单说下吧,_GetVerdorid这个函数就是生成,并获得设备识别号,_GetIDFA就是获得广告标志符。
这里面调用了ASIdentifierManager所以必须要#import <AdSupport/AdSupport.h>,如果你的项
目不需要这东西,你可以不加。至于UnitySendMessage这个应该不用我再说了,不知道的人自己搜下
相关的资料吧。


2017-03-16 22:25:37 net_guy 阅读数 468
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4643 人正在学习 去看看 张刚

最近在用JetBrains的Rider在做Unity3D的项目,用起来很舒服,但唯一不好的地方是它的Unity插件检测不到Standalone实例的端口,很是烦人,所以我就自己动手用PowerShell写了这么一个小工具,用来检测端口。这里得到的端口可以直接用来调试Unity3D程序。

主要代码:

Add-Type -AssemblyName System.Drawing
Add-Type -AssemblyName System.Windows.Forms
Import-Module .\Get-NetworkStatistics.ps1
$formTitle = "Unity Instance"
$formPosition = [System.Enum]::GetValues('System.Windows.Forms.FormStartPosition')[1]

$fieldComputerName = "ComputerName"
$fieldProcessName = "ProcessName"
$fieldLocalPort = "LocalPort"

$dataGridView = New-Object System.Windows.Forms.DataGridView
$form = New-Object System.Windows.Forms.Form
$form.add_FormClosing({$timer1.Stop()})

$timer1 = New-Object System.Windows.Forms.Timer
$timer1.Enabled = $true
$timer1.Start()
$timer1.Interval = 5000
$timer1.add_tick({CheckDataGridView})

function GetData
{
    return Get-NetworkStatistics -Computername $env:COMPUTERNAME -Protocol tcp -Address 0.0.0.0 -Port 56* | select $fieldComputerName, $fieldProcessName, $fieldLocalPort 
}

function SetupDataGridView
{
    $dataGridView.ColumnCount = 3
    $dataGridView.AutoSize = $true
    $dataGridView.Columns[0].Name = $fieldComputerName
    $dataGridView.Columns[1].Name = $fieldProcessName
    $dataGridView.Columns[2].Name = $fieldLocalPort

    CheckDataGridView
}

function SetupForm
{
    $form.AutoSize = $true
    $form.StartPosition = $formPosition 
    $form.MaximizeBox = $false
    $form.MinimizeBox = $false
    $form.Controls.Add($dataGridView)
    $form.Text = $formTitle
    $form.ShowDialog() 
}

function CheckDataGridView
{
    $datas = GetData
    $dataGridView.Rows.Clear()
    foreach($data in $datas)
    {
        if($data.ProcessName -ne "Unknown")
        {
            $row = $data.ComputerName, $data.ProcessName, $data.LocalPort 
            $dataGridView.Rows.Add($row) | Out-Null
        }
    }
    $dataGridView.AutoResizeRows()
    $dataGridView.Refresh()
}

function main
{
    SetupDataGridView
    SetupForm
}

main

Github源代码:

Get-UnityInstance

用法:

直接运行Start.bat

注意:

你运行代码的时侯可能会遇到提示PowerShell ExecutePolicy的问题。
你可以在管理员权限的PowerShell命令行里面试试:
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
要是你在使用中遇到问题,也可以通过站内信和我交流。

PowerShell权限参考:

Powershell 编写和运行脚本

2012-12-10 23:36:48 chinalofthjh 阅读数 118
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4643 人正在学习 去看看 张刚
unity3d 相机切换程序思想:为所有的相机设置相同的tag,这样可以使用FindGameObjectsWithTag来获得所有的相机。然后循环遍历关闭所有相机:XXX.GetComponent<Camera>().enabled = false。再把需要打开的相机打开,场景里唯一的相机讲作为mainCamera,u3d引擎会自动移动过去。

也可以获得相机对象后 直接设置其active属性为true/false来实现。











public class CameraSwap : MonoBehaviour 

{

GameObject[] gameObjectsCamera;



// Use this for initialization

void Start () {

gameObjectsCamera = GameObject.FindGameObjectsWithTag("cam");

}



// Update is called once per frame

void Update () {

if (Input.GetKey(KeyCode.Alpha1))

{

swapCamera(1);

}

if (Input.GetKey(KeyCode.Alpha2))

{

swapCamera(2);

}

if (Input.GetKey(KeyCode.Alpha3))

{

swapCamera(3);

}

}



void swapCamera(int index)

{

foreach (var item in gameObjectsCamera)

{

item.GetComponent<Camera>().enabled = false;

}

string name = "Camera" + index.ToString();

GameObject.Find(name).GetComponent<Camera>().enabled = true;

}

}
2019-10-11 18:21:07 qq_38506712 阅读数 32
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4643 人正在学习 去看看 张刚

Unity 与安卓

该篇文章主要是从我目前项目中所涉及的一些安卓设备或数据调用的问题,可能会很浅显;

获取安卓设备的SN串号(关于设备唯一标识符)

通常情况下,如果我们想要获取安卓设备的唯一标识用来识别设备或者做设备管理的话,需要用一个唯一且不变的标识号码;提到唯一标识号码,有人会立刻想到SystemInfo 类 (了解更多SystemInfo类:SystemInfo蛮牛): SystemInfo.deviceUniqueIdentifier ;
但是需要注意的是,通过SystemInfo获取到的唯一标识符是会改变的,没办法用来识别设备;该序列号是根据主板序列号.BIOS序列号.cpu信息.硬盘序列号.操作系统信息 来进行加密或者其他算法得出的,也许是某个东西会随着时间而改变 导致整个获取的标识符是会改变的。
接下来介绍两种安卓设备的可用于标识的方法和标识符;

  1. SN串号:
    获取方法:该方法可以获取大部分安卓手机的SN串号;
 AndroidJavaObject jo = new AndroidJavaObject("android.os.Build");
 string serial = jo.GetStatic<string>("SERIAL");

可以参考比较完整的写法:

 void getSerialNo()
    {
        if (Application.platform == RuntimePlatform.Android)
        { 
        var UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaClass osBuild = new AndroidJavaClass("android.os.Build");
            serialNo = osBuild.GetStatic<string>("SERIAL");
        }
         else
        {
            serialNo = "";
        }
    }

2、IMEI号或者MEID号码;有的手机双卡的话会有两个IMEI号码,不过对于手机来说IMEI号码及MEID是唯一且不变的,我们可以用来识别并管理设备;附上获取方法:

 /// <summary>
    /// 获取设备IMEI及MEID码
    /// </summary>
    void getDeviceIDs()
    {
        var UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        var context = UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
        var telephoneyManager = context.Call<AndroidJavaObject>("getSystemService", "phone");
        imei0 = telephoneyManager.Call<string>("getImei", 0);
        imei1 = telephoneyManager.Call<string>("getImei", 1);
        meid = telephoneyManager.Call<string>("getMeid");
    }

获取手机的蓝牙信息

贴出的代码主要是判断当前手机蓝牙是否已经打开

 public bool isBluetoothEnabled()
    {
        bool isBTEnabled = false;
        var UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        var context = UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
        var bluetoothManager = context.Call<AndroidJavaObject>("getSystemService", "bluetooth");
        if (bluetoothManager == null)
        {
            // Debug.Log( "isBluetoothEnabled bluetoothManager Get ...Failed");
            return isBTEnabled;
        }
        else
        {
            //Debug.Log( "isBluetoothEnabled bluetoothManager Get ...Succeed");
            var bluetoothAdaptor = bluetoothManager.Call<AndroidJavaObject>("getAdapter");
            if (bluetoothAdaptor == null)
            {
                return isBTEnabled;
            }
            else
            {
                isBTEnabled = bluetoothAdaptor.Call<bool>("isEnabled");
                return isBTEnabled;
            }
        }
    }

安卓设备的音量控制

可以参考以下链接:关于安卓音量控制
我在这里只贴出手机媒体音量的控制

 private const string currentVolume = "getStreamVolume";//当前音量
 private static readonly int STREAM_MUSIC = 3;
  private static readonly int ADJUST_LOWER = -1;
    private static readonly int ADJUST_SAME = 0;
    private static readonly int ADJUST_RAISE = 1;
    private static AndroidJavaObject audioManager;
     void Awake()
    {
#if UNITY_ANDROID && !UNITY_EDITOR
        AndroidJavaClass UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject currentActivity = UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
        audioManager = currentActivity.Call<AndroidJavaObject>("getSystemService", new AndroidJavaObject("java.lang.String", "audio"));
#endif
    }
    //调节音量大小
     public static void AdjustVolume(int volume)
    {
        var UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        var context = UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
        var audioManager = context.Call<AndroidJavaObject>("getSystemService", "audio");
        audioManager.Call("adjustStreamVolume", STREAM_MUSIC, volume, 0);
    }
    //直接设置媒体音量
     public static void SetVolume(int volume)
    {
        var UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        var context = UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
        var audioManager = context.Call<AndroidJavaObject>("getSystemService", "audio");
        audioManager.Call("setStreamVolume", STREAM_MUSIC, volume, 0);
    }

整理有点乱,不过对于我来说类似笔记,可以常常拿出来翻看巩固,也希望能帮助到一些人

2017-01-11 17:42:10 shengruqing 阅读数 996
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4643 人正在学习 去看看 张刚

下面方法中包含一些常用的获取设备唯一标识符,网络状态,isp等信息。

import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

import com.unity3d.player.UnityPlayerActivity;
import com.unity3d.player.UnityPlayerNativeActivity;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.provider.Settings.Secure;
import android.telephony.TelephonyManager;
import android.util.Log;

public class testss  extends UnityPlayerActivity{

    private String m_AndroidID;  
    private static final String TAG = "[PlugIn]";
    // ==============================================
    // Network
    //
    private static final int NetworkType_Invalid = 0;
    private static final int NetworkType_Unknown = 1;
    private static final int NetworkType_Mobile = 2;
    private static final int NetworkType_Wifi = 3;

    private static final int NetworkMobile_Unknown = 0;
    private static final int NetworkMobile_2G = 1;
    private static final int NetworkMobile_3G = 2;
    private static final int NetworkMobile_4G = 3;
    //获取MAC地址
    public String GetMacAddress()
    {
        WifiManager wifiMan = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        if (wifiMan != null && wifiMan.getConnectionInfo() != null)
        {
            WifiInfo wifiInf = wifiMan.getConnectionInfo();
            return wifiInf.getMacAddress();
        }
        return "";
    }
    //获取网络类型
    public int GetNetworkType()
    {
        ConnectivityManager connectivityMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connectivityMgr == null)
            return NetworkType_Invalid;
        NetworkInfo networkInfo = connectivityMgr.getActiveNetworkInfo();
        if (networkInfo == null)
            return NetworkType_Invalid;

        switch (networkInfo.getType())
        {
            case ConnectivityManager.TYPE_MOBILE:
                return NetworkType_Mobile;
            case ConnectivityManager.TYPE_WIFI:
                return NetworkType_Wifi;
            default:
                return NetworkType_Unknown;
        }
    }
    /*
     * GPRS 2G(2.5) General Packet Radia Service 114kbps EDGE 2G(2.75G) Enhanced
     * Data Rate for GSM Evolution 384kbps UMTS 3G WCDMA 联通3G Universal Mobile
     * Telecommunication System 完整的3G移动通信技术标准 CDMA 2G 电信 Code Division Multiple
     * Access 码分多址 EVDO_0 3G (EVDO 全程 CDMA2000 1xEV-DO) Evolution - Data Only
     * (Data Optimized) 153.6kps - 2.4mbps 属于3G EVDO_A 3G 1.8mbps - 3.1mbps
     * 属于3G过渡,3.5G 1xRTT 2G CDMA2000 1xRTT (RTT - 无线电传输技术) 144kbps 2G的过渡, HSDPA
     * 3.5G 高速下行分组接入 3.5G WCDMA High Speed Downlink Packet Access 14.4mbps HSUPA
     * 3.5G High Speed Uplink Packet Access 高速上行链路分组接入 1.4 - 5.8 mbps HSPA 3G
     * (分HSDPA,HSUPA) High Speed Packet Access IDEN 2G Integrated Dispatch
     * Enhanced Networks 集成数字增强型网络 (属于2G,来自维基百科) EVDO_B 3G EV-DO Rev.B 14.7Mbps
     * 下行 3.5G LTE 4G Long Term Evolution FDD-LTE 和 TDD-LTE , 3G过渡,升级版 LTE
     * Advanced 才是4G EHRPD 3G CDMA2000向LTE 4G的中间产物 Evolved High Rate Packet Data
     * HRPD的升级 HSPAP 3G HSPAP 比 HSDPA 快些
     */
    public int GetNetworkMobileClass()
    {
        // only valid in mobile network
        TelephonyManager tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);
        if (tm == null)
            return NetworkMobile_Unknown;
        switch (tm.getNetworkType())
        {
            case TelephonyManager.NETWORK_TYPE_GPRS:
            case TelephonyManager.NETWORK_TYPE_EDGE:
            case TelephonyManager.NETWORK_TYPE_CDMA:
            case TelephonyManager.NETWORK_TYPE_1xRTT:
            case TelephonyManager.NETWORK_TYPE_IDEN:
                return NetworkMobile_2G;
            case TelephonyManager.NETWORK_TYPE_UMTS:
            case TelephonyManager.NETWORK_TYPE_EVDO_0:
            case TelephonyManager.NETWORK_TYPE_EVDO_A:
            case TelephonyManager.NETWORK_TYPE_HSDPA:
            case TelephonyManager.NETWORK_TYPE_HSUPA:
            case TelephonyManager.NETWORK_TYPE_HSPA:
            case TelephonyManager.NETWORK_TYPE_EVDO_B:
            case TelephonyManager.NETWORK_TYPE_EHRPD:
            case TelephonyManager.NETWORK_TYPE_HSPAP:
                return NetworkMobile_3G;
            case TelephonyManager.NETWORK_TYPE_LTE:
                return NetworkMobile_4G;
            default:
                return NetworkMobile_Unknown;
        }

    }
 // ================================================
    // IMEI on GSM; MEID for CDMA
    //
    public String GetIMEIOrMEID()
    {
        // only valid in mobile network
        TelephonyManager tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);
        if (tm == null)
            return null;
        return tm.getDeviceId();
    }

    // ================================================
    // ISP
    public String GetISP()
    {
        TelephonyManager tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);
        if (tm == null)
            return "";
        return tm.getNetworkOperator();
    }

    // ================================================
    // Nation
    public String GetNationISO()
    {
        TelephonyManager tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);
        if (tm == null)
            return "";
        return tm.getNetworkCountryIso();
    }

 // 获取谁被UDID
    public String GetUDID()
    {
        if (m_AndroidID != null && !m_AndroidID.isEmpty())
            return m_AndroidID;

        m_AndroidID = Secure.getString(getContentResolver(), Secure.ANDROID_ID);
        return m_AndroidID;
    }

 // 应用第一次安装的时间
    public long Get1stInstallTime()
    {
        PackageManager packageManager = getPackageManager();
        try
        {
            PackageInfo packageInfo = packageManager.getPackageInfo(getPackageName(), 0);
            return packageInfo.firstInstallTime;// 应用第一次安装的时间
        }
        catch (Exception e)
        {
            return 0;
        }
    }

    //重新启动游戏
    public void RestartPackage(int delayMS)
    {
        Log.i(TAG, "RestartPackage");

        finish();

        // Intent intent =
        // getBaseContext().getPackageManager().getLaunchIntentForPackage(getBaseContext().getPackageName());
        // intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        // startActivity(intent);

        if (delayMS < 0)
            delayMS = 2000;

        Intent intent = new Intent(this, UnityPlayerNativeActivity.class);
        PendingIntent mypi = PendingIntent.getActivity(getApplicationContext(), 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK);
        AlarmManager al = (AlarmManager) getSystemService(ALARM_SERVICE);
        al.set(AlarmManager.RTC, System.currentTimeMillis() + delayMS, mypi);

        // System.exit(0);
        // android.os.Process.killProcess(android.os.Process.myPid());
    }

    // ================================================
    // IsRooted
    //
    public boolean IsRooted()
    {
        return _CheckBuildTag("test-keys") || _FindBinary("Test.apk");
    }

    static boolean _FindBinary(String binaryName)
    {
        String[] places = { "/system/app/", "/sbin/", "/system/bin/",
                "/system/xbin/", "/data/local/xbin/", "/data/local/bin/",
                "/system/sd/xbin/", "/system/bin/failsafe/", "/data/local/" };
        for (String where : places)
        {
            if (new File(where + binaryName).exists())
            {
                return true;
            }
        }
        return false;
    }

    static boolean _CheckBuildTag(String tag)
    {
        String buildTag = android.os.Build.TAGS;
        if (buildTag != null && buildTag.contains(tag))
            return true;
        return false;
    }

    // Turn GBK Code
    public String Turn_GBK_URLCode(String strInput)
    {

        try
        {
            String str = URLEncoder.encode(strInput, "GBK");
            return str;
        }
        catch (UnsupportedEncodingException e)
        {

        }
        return "";
    }     
}

在Unity中常用到的一些安卓方法封装 | 拾荒者 http://www.shihuangzhe.org/?p=532

没有更多推荐了,返回首页