iOS和Unity交互之参数传递

关于iOS和Unity交互的方法,进行简单的梳理.

调用方法一:
  • Unity调方法传参,有返回值.
    Unity代码:
[DllImport("__Internal")]
// 给iOS传string参数,有返回值,返回值通过iOS的return方法返回给Unity
private static extern string getIPv6(string mHost, string mPort)
  • iOS通过return方法,将值返回给Unity
    iOS代码:
/**
 获取IPv6的值,并返回给Unity

 @param mHost 主机名
 @param mPort 端口号
 @return IPv6值
*/
extern "C" const char * getIPv6(const char *mHost, const char *mPort)
{
    // strdup(const char *__s1) 复制mHost字符串,通过Malloc()进行空间分配 
    return strdup(mHost);
}

注意:

  • 1.如果Unity传参为string类型,不执行strdup()方法而使用return mHost方法,导致mHost没有分配内存空间而报错.
    报错信息:
skins(2509,0x1a8e5cb40) malloc: *** error for object 0x16fdc9114: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
  • 2.如果Unity传参为int类型,可以使用return mHost方法.
  • Unity代码:
[DllImport("__Internal")]
// 给iOS传int参数,无返回值,返回值通过iOS的return方法返回给Unity
private static extern int setMyInt(int date);
  • iOS代码:
// 返回int值
extern "C" int setMyInt(int date)
{
    return date;
}
  • 3.Unity方法中参数的变量名为date,在iOS中的extern “C” int setMyInt(int date)方法中设置的参数变量名可以与Unity的相同,设置为date,也可以是a、b、c等自定义参数变量,但是为了代码规范,尽量和Unity参数保持一致.

  • 4.调用DllImport(“”)方法,需要引入命名空间:
    using System.Runtime.InteropServices;

  • 5.extern “C”修饰的变量和函数是按照C语言方式编译和连接的.

调用方法二:
  • Unity调方法传参,无返回值.
    Unity代码:
// 传数据给iOS
[DllImport("__Internal")]
// 给iOS传string参数,无返回值,返回值通过iOS的UnitySendMessage方法返回给Unity
private static extern void setDate(string date);
// 接收iOS的数据
public void GetDate(string date)
{
}
  • iOS调方法,传参给Unity
    iOS代码:
/**
 返回Unity日期

 @param date 日期
 @return 无返回值
 */
extern "C" void setDate(const char *date)
{
    /**
     发送数据给Unity
     @param obj 模型名
     @param method Unity接收iOS数据的方法名
     @param msg 传给Unity的数据
     UnitySendMessage(const char* obj, const char* method, const char* msg);
    */
    UnitySendMessage("PublicGameObject", "GetDate", date);
}

注意

  • iOS通过UnitySendMessage方法返回数据给Unity时,需要传正确的date值,如果UnitySendMessage方法中的第三个参数不是将date作为参数,而是自定义的NSString类,需要做类型转换(Unity中的字符串为string,OC中的字符串为NSString)如下代码:
extern "C" void setDate(const char *date)
{
    NSString *dateStr = @"Hello Word";
    UnitySendMessage("PublicGameObject", "GetDate", [dateStr UTF8String]);
}
以下是全部代码
  • Unity的.cs文件:
using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;
using UnityEngine.UI;

public class Iossdk : MonoBehaviour
{
    // getIPv6方法单独使用,setDate和GetDate配合使用
    public InputField[] ips;

    [DllImport("__Internal")]
    // 给iOS传string参数,有返回值,返回值通过iOS的return方法返回给Unity
    private static extern string getIPv6(string mHost, string mPort)

    [DllImport("__Internal")]
    // 给iOS传string参数,无返回值,返回值通过iOS的UnitySendMessage方法返回给Unity
    private static extern void setDate(string date);

    [DllImport("__Internal")]
    // 给iOS传int参数,无返回值,返回值通过iOS的return方法返回给Unity
    private static extern int setMyInt(int date);

    // 传int参数给iOS
    public void SetMyInt()
    {
      #if UNITY_IPHONE && !UNITY_EDITOR
          int result = setMyInt(int.Parse(ips[1].text));
          Debug.Log(result);
      #else
          Debug.Log(int.Parse(ips[1].text));
      #endif
    }

    // 传string参数给iOS
    public void SetDate()
    {
      #if UNITY_IPHONE && !UNITY_EDITOR
          setDate(ips[0].text);
      #else
          Debug.Log(ips[0].text);
      #endif
    }

    // 接收iOS的数据
    public void GetDate(string date)
    {
      ips[1].text = date;
      Debug.Log(date);
    }

    // 通过主机名和端口号获取IPv6
    public static string GetIPv6(string mHost, string mPort)
    {
      #if UNITY_IPHONE && !UNITY_EDITOR
          string mIPv6 = getIPv6(mHost, mPort);
          return mIPv6;
      #else
          return mHost + " : " + mPort;
      #endif
    }

    // 程序入口1
    public void Click1()
    {
      string s = GetIPv6(ips[0].text, ips[1].text);
      Debug.Log(s);
    }

    // iOS程序入口2 
    public void Click2()
    {
      SetDate();
    }

    // iOS程序入口3 
    public void Click3()
    {
     SetMyInt();
    }
}
  • iOS代码 :

  • .h文件

#import <Foundation/Foundation.h>

@interface IOSToUnity : NSObject

@end
  • .m文件
#import "IOSToUnity.h"

@implementation IOSToUnity

/**
 获取IPv6的值,并返回给Unity

 @param mHost 主机名
 @param mPort 端口号
 @return IPv6值
*/
extern "C" const char * getIPv6(const char *mHost, const char *mPort)
{
    // strdup(const char *__s1) 复制mHost字符串,通过Malloc()进行空间分配 
    return strdup(mHost);
}

/**
 返回Unity日期

 @param date 日期
 @return 无返回值
*/
extern "C" void setDate(const char *date)
{
    /**
     发送数据给Unity
     @param obj 模型名
     @param method Unity接收iOS数据的方法名
     @param msg 传给Unity的数据
     UnitySendMessage(const char* obj, const char* method, const char* msg);
    */
    UnitySendMessage("PublicGameObject", "GetDate", date);
}

/**
 返回int值

 @param mHost 主机名
 @return 主机名
*/
extern "C" int setMyInt(int date)
{
    return date;
}

@end

如果已经掌握本文参数传递的方法,不妨看下iOS和Unity交互之界面跳转.


简书

iOS和Unity交互之参数传递

个人博客

iOS和Unity交互之参数传递

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Unity 是一种跨平台的游戏开发引擎,而 Kafka 是一种分布式流处理平台和消息系统。Unity 中的游戏可以使用 Kafka 进行实时数据的传输和消息的处理。 首先,Unity 可以通过 Kafka 的 Producer API 将游戏中的实时数据发送到 Kafka 的 Topic 中。这些数据可以是玩家的位置信息、游戏状态信息等。Producer API 提供了各种异步方式来确保数据的可靠传输,并具有高效的性能。 然后,Unity 中的其他模块或者其他游戏可以通过 Kafka 的 Consumer API 从 Kafka 的 Topic 中订阅并接收这些实时数据。Consumer API 提供了多种方式来处理和消费这些数据,例如可以对数据进行过滤、转换和聚合等操作。 通过使用 Unity 和 Kafka 的结合,游戏开发者可以实现一些有趣的功能。例如,在多人游戏中,可以通过 Kafka 在不同的游戏实例之间实现实时的位置同步和游戏状态同步。这样,即使玩家在不同的设备上,也可以获得一致的游戏体验。 另外,Unity 还可以通过 Kafka 的消息系统来实现游戏内部的消息通讯。通过订阅不同的 Topic,不同的游戏模块可以收到对应的消息,并进行相关的处理。这样的架构可以实现游戏中的解耦和模块化,提高代码的可维护性和可扩展性。 总而言之,通过 Unity 和 Kafka 的交互,游戏开发者可以实现更灵活、实时和可扩展的游戏功能,提升游戏的用户体验。 ### 回答2: Unity是一种跨平台的游戏开发引擎,用于创建高品质的游戏和虚拟现实应用程序。而Kafka是一个分布式流处理平台,用于管理高吞吐量的实时数据流。当Unity需要与Kafka进行交互时,可以采取以下几种方式: 1. 使用第三方库:可以使用现有的适配库或插件来在Unity中与Kafka进行交互。这些库可以提供对Kafka的直接访问,使得Unity能够发送和接收消息,读取和写入数据流,并处理Kafka的事件。 2. 自定义开发:如果没有现成的适配库,可以通过编写自定义的通信模块来实现Unity和Kafka的交互。该模块可以使用Kafka提供的API进行连接和通信,将Unity中的数据发送到Kafka或从Kafka接收数据,并处理相关的事件。 3. 使用中间件:可以使用消息中间件作为Unity和Kafka之间的桥梁。消息中间件可以提供统一的消息传递机制,使得Unity可以将消息发送到中间件,中间件再将消息传递给Kafka。同样地,中间件也可以接收Kafka的消息,并将其传递给Unity。这种方式可以简化Unity与Kafka之间的整合,并提高系统的可扩展性和灵活性。 总之,Unity和Kafka之间的交互可以通过适配库、自定义开发或使用消息中间件来实现。这样,Unity就能够与Kafka进行数据的交换和实时的流处理,为游戏和虚拟现实应用程序提供了更强大的功能和更好的用户体验。 ### 回答3: Unity是一种强大的跨平台游戏开发引擎,而Kafka是一种高性能分布式消息队列系统。Unity和Kafka可以通过网络进行交互。 首先,我们需要在Unity项目中集成一个Kafka客户端库,例如使用C#编写的KafkaNet。这个库可以帮助我们与Kafka建立连接、发送和接收消息。 在Unity中,我们可以创建一个KafkaProducer对象和一个KafkaConsumer对象。KafkaProducer用于发布消息到Kafka主题,KafkaConsumer则用于从Kafka主题接收消息。 在Unity中发送消息到Kafka,我们可以使用KafkaProducer的Send方法发送消息。我们需要指定要发送的主题和消息内容。例如: ``` KafkaProducer producer = new KafkaProducer("localhost:9092"); producer.Send("myTopic", "Hello Kafka!"); ``` 在Unity中接收Kafka的消息,我们可以使用KafkaConsumer的Start方法启动一个消息循环,用于从Kafka主题接收消息。我们可以在循环中处理接收到的消息。例如: ``` KafkaConsumer consumer = new KafkaConsumer("localhost:9092", "myTopic"); consumer.Start(); while (true) { string message = consumer.Receive(); Debug.Log("Received message: " + message); } ``` Unity和Kafka的交互可以实现很多有趣的功能。例如,我们可以在Unity游戏中使用Kafka来获取实时的游戏数据,如得分、位置等。我们还可以使用Kafka将玩家的行为记录下来,以分析和改进游戏设计。通过Unity和Kafka的交互,游戏开发者可以更好地了解和控制游戏的状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值