Unity中 Ref 和 Out 的使用差别

本文讨论了C#中的Ref和Out关键字,强调了它们在值传递方式上的差异:Ref要求在调用时初始化,且值会改变;Out则无需初始化,但必须在函数内部赋值,确保函数执行结束后值已确定。Unity中的射线检测示例说明了Out的自动初始化特性。
摘要由CSDN通过智能技术生成

Ref 和 Out 的 共同点

  • 都是将值通过引用的方式来进行传递的关键词

Ref 和 Out 的 不同点

  • Ref 进函数时必须初始化

    void DoSomething() {
    	int i = 1;
    	Change(ref i);
        
        // i 的数值会进到 函数里面 去被更改,最后再出来
        // 最终会导致里面的 i 的值为4
    }
    
    void Change(ref int a) {
        a = 4;
    }
    
    
    
  • Out 可以不初始化,但 Out 一定要在函数内部进行赋值。Out 的意义是 能保证函数在退出前,传入的引用一定会被赋值,所以才能传入未初始化的的值,因为用out传入引用就相当一种初始化。在Unity中的案例就是射线检测用的就是Out

    void DoSomething() {
        // 对 i 没有进行初始化,而是进行内存的分配
        // 因为使用 out 的时候,out 会自动对其再次初始化一遍,会无视之前的初始化
    	int i;
    	Change(out i);
        
        // i 的数值无论前面发生了什么,都不会进到函数里面,而是会在出来的时候再次被初始化
        // 最终会导致里面的 i 的值为4
    }
    
    void Change(out int a) {
        // 在这里再次对 参数a 进行初始化,无论之前数据如何
        a = 4;
    }
    
    
Unity接收UDP数据包可以使用Unity自带的Network API,具体实现方法如下: 1. 创建一个用于接收UDP数据的类,并实现Unity自带的Network API的接口`INetworkMessageReceiver`。 ```csharp public class UDPReceiver : MonoBehaviour, INetworkMessageReceiver { public void OnMessageReceived(byte[] data, int length, long id, int channelId) { // 处理接收到的数据 } } ``` 2. 在该类实例化一个UDPClient,并监听指定的端口。 ```csharp public class UDPReceiver : MonoBehaviour, INetworkMessageReceiver { private UdpClient udpClient; private void Start() { udpClient = new UdpClient(1234); udpClient.BeginReceive(OnDataReceived, null); } private void OnDataReceived(IAsyncResult result) { IPEndPoint source = new IPEndPoint(0, 0); byte[] data = udpClient.EndReceive(result, ref source); // 将接收到的数据发送到Unity的消息队列 NetworkTransport.ReceiveFromHost(0, data, data.Length, 0, ref source, out int error); // 继续监听UDP数据包 udpClient.BeginReceive(OnDataReceived, null); } public void OnMessageReceived(byte[] data, int length, long id, int channelId) { // 处理接收到的数据 } } ``` 3. 在Unity使用`NetworkTransport.AddHost`方法创建一个本地主机,并将上面创建的UDPReceiver类实例化后,传递给该方法。 ```csharp void Start() { ConnectionConfig config = new ConnectionConfig(); int channelId = config.AddChannel(QosType.Reliable); HostTopology topology = new HostTopology(config, 10); int hostId = NetworkTransport.AddHost(topology, 8888); // 实例化UDPReceiver类 UDPReceiver receiver = new UDPReceiver(); // 设置UDPReceiver类为消息接收者 NetworkTransport.SetMessageHandler(receiver); } ``` 4. 接下来就可以在UDPReceiver类的`OnMessageReceived`方法处理接收到的数据了。如果接收到的数据是16进制格式,可以使用`BitConverter`类将byte数组转换为整数。 ```csharp public class UDPReceiver : MonoBehaviour, INetworkMessageReceiver { public void OnMessageReceived(byte[] data, int length, long id, int channelId) { // 将byte数组转换为整数 int receivedData = BitConverter.ToInt32(data, 0); // 处理接收到的数据 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值