unity调用ios的参数传入与返回

这个比较简单,注意一下string类型的返回就好了。
不说了直接上代码:
1、oc

#if defined (__cplusplus)
extern "C"
{
#endif
    BOOL u3d_getBool1(BOOL _input)
    {
        NSLog(@"_input value:%@",_input?@"Yes":@"No");
        return true;
    }

    BOOL u3d_getBool2(BOOL _input)
    {
        NSLog(@"_input value:%@",_input?@"Yes":@"No");
        return false;
    }

    int u3d_getInt(int _input)
    {
        return _input + 100;
    }

    long u3d_getLong(long _input)
    {
        return _input + 123l;
    }

    float u3d_getFloat(float _input)
    {
        return _input + 0.123f;
    }

    double u3d_getDouble(double _input)
    {
        return _input + 0.123456l;
    }

    char * u3d_getString(const char * _input)
    {
        NSString *str = [NSString stringWithUTF8String:_input];

        NSString *newstr = [NSString stringWithFormat:@"%@--%@", str, @"_fromOC"];
        const char * _output = [newstr UTF8String];

        NSLog(@"%@, %@, %s",str,newstr,_output);

        // 是里如果直接返回_output是会报错的,因为它是是const,不能被返回。
        char* res = (char*)malloc(strlen(_output)+1);
        strcpy(res, _output);

        return res;
    }

    // 封装json
    void u3d_packageJosn()
    {
        // 构造一个nsdictionary
        NSDictionary *dict = @{
                               @"name":@"小海",
                               @"age":@102,
                               @"weight":@56.5f,
                               @"height":@165.555f,
                               @"nice":@YES
                               };
        // 判断dict是否可转成json
        BOOL isYes = [NSJSONSerialization isValidJSONObject:dict];
        NSLog(@"u3d_packageJosn isYes : %@",isYes?@"Yes":@"No");

        // nsdictionary --> nsdata
        NSData *data = [NSJSONSerialization dataWithJSONObject:dict options:kNilOptions error:nil];
        NSLog(@"u3d_packageJosn data: %@", data);

        // nsdata -> nsstring
        NSString *jsonString = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
        NSLog(@"u3d_packageJosn jsonString: %@", jsonString);

        // nsstring -> const char*
        const char* constStr = [jsonString UTF8String];

        // 调用unity3d中的方法
        UnitySendMessage("Main Camera", "CallbackFormIOS_1", constStr);
    }

    // 解析json
    void u3d_parseJson(const char * jsonStr)
    {
        // const char* --> nnstring
        NSString *jsonString = [NSString stringWithUTF8String:jsonStr];
        NSLog(@"u3d_parseJson jsonString: %@", jsonString);

        // nsstring -> nsdata
        NSData *data = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
        NSLog(@"u3d_parseJson data: %@", data);

        // nsdata -> nsdictionary
        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
        NSLog(@"u3d_parseJson dict: %@",dict);
        NSLog(@"dict - name: %@",dict[@"name"]);
        NSLog(@"dict - age: %@",dict[@"age"]);
        NSLog(@"dict - weight: %@",dict[@"weight"]);
        NSLog(@"dict - height: %@",dict[@"height"]);
        NSLog(@"dict - nice: %@",dict[@"nice"]);
    }
#if defined (__cplusplus)
}
#endif

2、c#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Runtime.InteropServices;

public class IOSLibraryBridge
{

    #if UNITY_IOS || UNITY_IPHONE

    [DllImport("__Internal")] 
    private static extern bool u3d_getBool1 (bool _input); 

    [DllImport("__Internal")] 
    private static extern bool u3d_getBool2 (bool _input); 

    [DllImport("__Internal")] 
    private static extern int u3d_getInt (int _input); 

    [DllImport("__Internal")] 
    private static extern long u3d_getLong (long _input); 

    [DllImport("__Internal")] 
    private static extern float u3d_getFloat (float _input); 

    [DllImport("__Internal")] 
    private static extern double u3d_getDouble (double _input); 

    [DllImport("__Internal")] 
    private static extern string u3d_getString (string _input); 

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

    [DllImport("__Internal")] 
    private static extern void u3d_parseJson (string _input); 
    #endif

    public static bool getBool1 (bool _input)
    {
        #if UNITY_IOS || UNITY_IPHONE
        return u3d_getBool1(_input);
        #else
        return false;
        #endif
    }


    public static bool getBool2 (bool _input)
    {
        #if UNITY_IOS || UNITY_IPHONE
        return u3d_getBool2(_input);
        #else
        return false;
        #endif
    }

    public static int getInt (int _input)
    {
        #if UNITY_IOS || UNITY_IPHONE
        return u3d_getInt(_input);
        #else
        return 0;
        #endif
    }

    public static long getLong (long _input)
    {
        #if UNITY_IOS || UNITY_IPHONE
        return u3d_getLong(_input);
        #else
        return 0L;
        #endif
    }

    public static float getFloat (float _input)
    {
        #if UNITY_IOS || UNITY_IPHONE
        return u3d_getFloat(_input);
        #else
        return 0f;
        #endif
    }

    public static double getDouble (double _input)
    {
        #if UNITY_IOS || UNITY_IPHONE
        return u3d_getDouble(_input);
        #else
        return 0d;
        #endif
    }

    public static string getString (string _input)
    {
        #if UNITY_IOS || UNITY_IPHONE
        return u3d_getString(_input);
        #else
        return "--empty--";
        #endif
    }

    public static void packageJson ()
    {
        #if UNITY_IOS || UNITY_IPHONE
        u3d_packageJosn();
        #endif
    }

    public static void parseJson (string _input)
    {
        #if UNITY_IOS || UNITY_IPHONE
        u3d_parseJson(_input);
        #endif
    }
}

3、c#测试

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

public class Test : MonoBehaviour {

    // Use this for initialization
    void Start () {
        bool b1 = IOSLibraryBridge.getBool1 (true);
        Debug.Log ("b1:" + b1);
        bool b2 = IOSLibraryBridge.getBool2 (false);
        Debug.Log ("b2:" + b2);
        int int1 = IOSLibraryBridge.getInt (10);
        Debug.Log ("int1:" + int1);
        long long1 = IOSLibraryBridge.getLong (10L);
        Debug.Log ("long1:" + long1);
        float float1 = IOSLibraryBridge.getFloat (10f);
        Debug.Log ("float1:" + float1);
        double double1 = IOSLibraryBridge.getDouble (10d);
        Debug.Log ("double1:" + double1);
        string string1 = IOSLibraryBridge.getString ("hello");

    IOSLibraryBridge.packageJson ();
        string json = "{\"age\":102,\"weight\":65.5,\"name\":\"阿海\",\"height\":175.555,\"nice\":true}";
        IOSLibraryBridge.parseJson (json);
    }

    void CallbackFormIOS_1(string jsonStr)
    {
        Debug.Log("CallbackFormIOS_1: " + jsonStr);
        LitJson.JsonData jd = LitJson.JsonMapper.ToObject (jsonStr);
        if (jd != null) 
        {
            string name = jd ["name"].ToString ();
            int age = int.Parse(jd ["age"].ToString());

            float weight = float.Parse(jd ["weight"].ToString());
            float height = float.Parse(jd ["height"].ToString());
            bool nice = bool.Parse(jd ["nice"].ToString());

            Debug.Log(string.Format("name={0},age={1},weight={2},height={3},nice={4},",name,age,weight,height,nice));
        }
    }
}

注:unity版本 5.6

你可能感兴趣的:(Unity3D,U3d,IOS)