Не удается создать экземпляр массива byte[] в сценариях кодирования на C # внутри Unity3D; Как мне это исправить?

#c# #tcp #unity3d #client

#c# #tcp #unity3d #клиент

Вопрос:

Итак, я пытаюсь отправлять / получать сообщения между моим проектом Unity и другим окном, которое действует как сервер. Я не могу использовать stream.Read() с имеющимся у меня сейчас массивом байтов. В нем говорится, что это исключение NullReferenceException, и оно не создается, хотя я думаю, что это так. Это может быть что-то очень простое, но это действительно беспокоит меня, лол. Вот код; строка, которая выдает исключение, — это stream.Read(….):

 using UnityEngine;
using System.Collections;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Threading;
using System.Net;
using System.Diagnostics;
using System.Net.NetworkInformation;
using System.IO;

public class Client_Script : MonoBehaviour {

byte[] SendBuffer = null;
TcpClient client = null;
NetworkStream stream = null;
int PortNumber = 3003;
string IP = "192.168.1.100";

// Use this for initialization
void Start () {

    try
    {

        SendBuffer = new byte[1024];
        client = new TcpClient();
        client.Connect(IP, PortNumber);

    }
    catch (Exception e)
    {   

        //"Couldn't connect to destination"

    }

    stream = client.GetStream();

}

// Update is called once per frame
void Update () {

    stream.Read (SendBuffer, 0, 1024);

    string message = BitConverter.ToString (SendBuffer);

    ASCIIEncoding encoder = new ASCIIEncoding ();

    SendBuffer = encoder.GetBytes (message);

    stream.Write (SendBuffer, 0, SendBuffer.Length);

    }
}
 

===============================================================

На самом деле кода не так много; Я просто разочарован тем, как он говорит, что он не создается, хотя он есть. В нем может не быть действительных данных, но я все равно его создал. Это работает в проектах Visual Studio, но не тогда, когда я использую его внутри Unity3D.

Комментарии:

1. Вы уверены, что перед обновлением вызывается Start?

2. В Unity ‘Start’ всегда вызывается перед ‘Update’ при создании экземпляра объекта MonoBehaviour

Ответ №1:

  1. Вам нужно вдвойне убедиться, что Update() не вызывается перед вызовом Start() — видел это десятки раз в коде, где люди сначала подключают обработчики событий, а затем инициализируют.
  2. В текущем состоянии, если внутри Start() есть исключение, вы, судя по всему, его вообще не обрабатываете, поэтому «клиент» может возвращать нулевое значение, и это то, что на самом деле является причиной исключения.