前段时间发现有人挖我19年的坟,不过这个问题其实我早就解决了,而且他的回复的地址当时就知道了,只是光看这些没有整理资料实际很难直接了解IGC对象用法。
正巧最近又看见有人在问这个问题(不过他可能已经解决了),所以我就写了下面的东西,有需要的可以看看。
一,获取IMyIntergridCommunicationSystem对象
至少从我入坑开始,就已经推荐用直接操作天线方块的方式通信了,取而代之的是调用IMyIntergridCommunicationSystem对象。IMyIntergridCommunicationSystem不能直接创建,只能通过MyGridProgram对象的IGC属性获取,比如
public Program()
{
IMyIntergridCommunicationSystem myIGC=this.IGC;
}
通信将会有两种模式,广播和单播(点对点)。
二,发送信息
1,广播
通过以下IMyIntergridCommunicationSystem对象的方法进行广播
public bool SendBroadcastMessage<TData>(string tag,TData Data,TransmissionDistance transmissionDistance)
tag 是广播的频道
Data 是传送的数据,TData改成你要实际传递的信息的数据类型,比如string
transmissionDistance 是传的范围,常用的是两个:TransmissionDistance.CurrentConstruct当前网格;TransmissionDistance.AntennaRelay天线范围
比如
public void Main(string argument, UpdateType updateSource)
{
this.IGC.SendBroadcastMessage<string>("MyInfo","Hello",TransmissionDistance.AntennaRelay)
}
2,单播
通过以下IMyIntergridCommunicationSystem对象的方法进行单播
public bool SendUnicastMessage<TData>(long addressee, string tag, TData data)
addressee 是对方地址,可以让对方预先用广播方式发过来。可以通过IMyIntergridCommunicationSystem的public long Me { get; }属性取得自己的地址(比如 long myadd=this.IGC.Me;),然后广播给对方。
tag 是广播的频道
Data 是传送的数据
三,接收数据
1,注册接收对象及设置回调
接收数据前广播方式先要注册接收对象,通过以下IMyIntergridCommunicationSystem对象的方法进行注册
public IMyBroadcastListener RegisterBroadcastListener(string tag)
比如:
IMyBroadcastListener ThisBroadcast;
public Program()
{
ThisBroadcast=this.IGC.RegisterBroadcastListener("MyInfo");
}
单播不需要注册接收对象,直接通过public IMyUnicastListener UnicastListener { get; }得到接收对像
比如
IMyUnicastListener ThisUnicast;
public Program()
{
ThisUnicast=this.IGC.UnicastListener;
}
取得了接收对象后还要设置回调
public void SetMessageCallback(string argument)
IMyBroadcastListener(广播接收对象)和IMyUnicastListener(单播接收对象)都有这个方法,参数和前面发送数据的tag(频道)一致即可。
2,接收数据
在设置完回调后,接收到数据时会调用public void Main(string argument, UpdateType updateSource),argument和设置回调的argument相同(但是用处不大),updateSource的值为UpdateType.IGC。
public MyIGCMessage AcceptMessage()方法,IMyBroadcastListener(广播接收对象)和IMyUnicastListener(单播接收对象)都有这个方法,用来返回一条信息。
用AcceptMessage().Data.ToString()可以简单地把信息转换为字符串。
因此可以这样:
public void Main(string argument, UpdateType updateSource)
{
switch (updateSource)
{
case UpdateType.IGC:
string MSG=ThisBroadcast.AcceptMessage().Data.ToString();
//处理MSG
break;
}
}
但是注意,实际上游戏的每一帧无论收到多少信息只会调用一次Main过程,所以还要用到
public bool HasPendingMessage { get; }
来测试是不是还有数据传到。
IMyBroadcastListener(广播接收对象)和IMyUnicastListener(单播接收对象)都有这个属性
因此还要改成这样:
public void Main(string argument, UpdateType updateSource)
{
switch (updateSource)
{
case UpdateType.IGC:
for (;ThisBroadcast.HasPendingMessage;)
{
string MSG=ThisBroadcast.AcceptMessage().Data.ToString();
//处理MSG
}
break;
}
}
以上就通信对象简单应用的内容。
一个完整示例:
MySendClass MySend;
public Program()
{
MySend=new MySendClass(this);//初始化
}
public void Main(string argument, UpdateType updateSource)
{
MySend.AutoDoIt(argument,updateSource);//调用处理过程
}
class MySendClass
{
private MyGridProgram ThisMyGridProgram;
private IMyBroadcastListener ThisBroadcast;//广播接收
const string BroadcastTag="MyClass";//广播Tag
public MySendClass(MyGridProgram mygridprogram)
{
ThisMyGridProgram=mygridprogram;
ThisBroadcast=ThisMyGridProgram.IGC.RegisterBroadcastListener(BroadcastTag);//注册广播接收
ThisBroadcast.SetMessageCallback(BroadcastTag);//广播回调
}
public void AutoDoIt(string argument, UpdateType updateSource)
{
string MSG="";
switch (updateSource)
{
case UpdateType.IGC://通信事件
for (;ThisBroadcast.HasPendingMessage;)
{//只要有通信数据就循环
MSG=ThisBroadcast.AcceptMessage().Data.ToString();//取出一份通信数据
ThisMyGridProgram.Me.CustomData=MSG;//写入编程块的自定义数据
}
break;
case UpdateType.Terminal://手动运行
MSG=ThisMyGridProgram.Me.CustomData;//编程块的自定义数据
ThisMyGridProgram.IGC.SendBroadcastMessage<string>(BroadcastTag,MSG,TransmissionDistance.AntennaRelay);//把编程块的自定义数据通过天线发送出去
break;
case UpdateType.Trigger://触发运行(定时器、按钮之类)
MSG=ThisMyGridProgram.Me.CustomData;
ThisMyGridProgram.IGC.SendBroadcastMessage<string>(BroadcastTag,MSG,TransmissionDistance.AntennaRelay);
break;
}
}
}
以上代码在两个编程块里各放一份。在终端上手动运行就可以把自定义数据里的文本发送出去,另一个编程块接收到后会写入自己的自定义数据。
正巧最近又看见有人在问这个问题(不过他可能已经解决了),所以我就写了下面的东西,有需要的可以看看。
一,获取IMyIntergridCommunicationSystem对象
至少从我入坑开始,就已经推荐用直接操作天线方块的方式通信了,取而代之的是调用IMyIntergridCommunicationSystem对象。IMyIntergridCommunicationSystem不能直接创建,只能通过MyGridProgram对象的IGC属性获取,比如
public Program()
{
IMyIntergridCommunicationSystem myIGC=this.IGC;
}
通信将会有两种模式,广播和单播(点对点)。
二,发送信息
1,广播
通过以下IMyIntergridCommunicationSystem对象的方法进行广播
public bool SendBroadcastMessage<TData>(string tag,TData Data,TransmissionDistance transmissionDistance)
tag 是广播的频道
Data 是传送的数据,TData改成你要实际传递的信息的数据类型,比如string
transmissionDistance 是传的范围,常用的是两个:TransmissionDistance.CurrentConstruct当前网格;TransmissionDistance.AntennaRelay天线范围
比如
public void Main(string argument, UpdateType updateSource)
{
this.IGC.SendBroadcastMessage<string>("MyInfo","Hello",TransmissionDistance.AntennaRelay)
}
2,单播
通过以下IMyIntergridCommunicationSystem对象的方法进行单播
public bool SendUnicastMessage<TData>(long addressee, string tag, TData data)
addressee 是对方地址,可以让对方预先用广播方式发过来。可以通过IMyIntergridCommunicationSystem的public long Me { get; }属性取得自己的地址(比如 long myadd=this.IGC.Me;),然后广播给对方。
tag 是广播的频道
Data 是传送的数据
三,接收数据
1,注册接收对象及设置回调
接收数据前广播方式先要注册接收对象,通过以下IMyIntergridCommunicationSystem对象的方法进行注册
public IMyBroadcastListener RegisterBroadcastListener(string tag)
比如:
IMyBroadcastListener ThisBroadcast;
public Program()
{
ThisBroadcast=this.IGC.RegisterBroadcastListener("MyInfo");
}
单播不需要注册接收对象,直接通过public IMyUnicastListener UnicastListener { get; }得到接收对像
比如
IMyUnicastListener ThisUnicast;
public Program()
{
ThisUnicast=this.IGC.UnicastListener;
}
取得了接收对象后还要设置回调
public void SetMessageCallback(string argument)
IMyBroadcastListener(广播接收对象)和IMyUnicastListener(单播接收对象)都有这个方法,参数和前面发送数据的tag(频道)一致即可。
2,接收数据
在设置完回调后,接收到数据时会调用public void Main(string argument, UpdateType updateSource),argument和设置回调的argument相同(但是用处不大),updateSource的值为UpdateType.IGC。
public MyIGCMessage AcceptMessage()方法,IMyBroadcastListener(广播接收对象)和IMyUnicastListener(单播接收对象)都有这个方法,用来返回一条信息。
用AcceptMessage().Data.ToString()可以简单地把信息转换为字符串。
因此可以这样:
public void Main(string argument, UpdateType updateSource)
{
switch (updateSource)
{
case UpdateType.IGC:
string MSG=ThisBroadcast.AcceptMessage().Data.ToString();
//处理MSG
break;
}
}
但是注意,实际上游戏的每一帧无论收到多少信息只会调用一次Main过程,所以还要用到
public bool HasPendingMessage { get; }
来测试是不是还有数据传到。
IMyBroadcastListener(广播接收对象)和IMyUnicastListener(单播接收对象)都有这个属性
因此还要改成这样:
public void Main(string argument, UpdateType updateSource)
{
switch (updateSource)
{
case UpdateType.IGC:
for (;ThisBroadcast.HasPendingMessage;)
{
string MSG=ThisBroadcast.AcceptMessage().Data.ToString();
//处理MSG
}
break;
}
}
以上就通信对象简单应用的内容。
一个完整示例:
MySendClass MySend;
public Program()
{
MySend=new MySendClass(this);//初始化
}
public void Main(string argument, UpdateType updateSource)
{
MySend.AutoDoIt(argument,updateSource);//调用处理过程
}
class MySendClass
{
private MyGridProgram ThisMyGridProgram;
private IMyBroadcastListener ThisBroadcast;//广播接收
const string BroadcastTag="MyClass";//广播Tag
public MySendClass(MyGridProgram mygridprogram)
{
ThisMyGridProgram=mygridprogram;
ThisBroadcast=ThisMyGridProgram.IGC.RegisterBroadcastListener(BroadcastTag);//注册广播接收
ThisBroadcast.SetMessageCallback(BroadcastTag);//广播回调
}
public void AutoDoIt(string argument, UpdateType updateSource)
{
string MSG="";
switch (updateSource)
{
case UpdateType.IGC://通信事件
for (;ThisBroadcast.HasPendingMessage;)
{//只要有通信数据就循环
MSG=ThisBroadcast.AcceptMessage().Data.ToString();//取出一份通信数据
ThisMyGridProgram.Me.CustomData=MSG;//写入编程块的自定义数据
}
break;
case UpdateType.Terminal://手动运行
MSG=ThisMyGridProgram.Me.CustomData;//编程块的自定义数据
ThisMyGridProgram.IGC.SendBroadcastMessage<string>(BroadcastTag,MSG,TransmissionDistance.AntennaRelay);//把编程块的自定义数据通过天线发送出去
break;
case UpdateType.Trigger://触发运行(定时器、按钮之类)
MSG=ThisMyGridProgram.Me.CustomData;
ThisMyGridProgram.IGC.SendBroadcastMessage<string>(BroadcastTag,MSG,TransmissionDistance.AntennaRelay);
break;
}
}
}
以上代码在两个编程块里各放一份。在终端上手动运行就可以把自定义数据里的文本发送出去,另一个编程块接收到后会写入自己的自定义数据。









