【问题标题】:Connecting Unity3d to a 4.0 .net framework API visual studio program将 Unity3d 连接到 4.0 .net 框架 API Visual Studio 程序
【发布时间】:2017-03-06 21:15:35
【问题描述】:

我有一个乐高 EV3。我正在使用 API 在 Visual Studio 中使用 C#。

我试过了,看来在 EV3 上使用 unity3d 的唯一方法是使用两个程序并让它们通信。

Unity 使用 2.0 框架,因此 async 函数不起作用(我很确定,如果有人可以在 unity 上获得 async 那就更好了)。

所以我正在尝试使用套接字,并且我相信我对代码一切都很好,但是当我运行两台计算机时,我的计算机都在主动拒绝连接。

防火墙已关闭,以管理员身份运行。

那么我该如何解决我的套接字问题,以便我可以与 unity3d 通信,或者我如何与 unity3d 通信?

很抱歉代码有多么草率,但这是我正在处理的主要代码,所以我运行它并控制我的机器人,但无法将数据发送到我在 unity3d 中运行的程序。

通过代码和 //7777777777777777777777777777777777 将显示当我单击按钮 3 并说我的计算机主动拒绝时它停止的位置

`using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Lego.Ev3.Core;
using Lego.Ev3.Desktop;
using UnityEngine;
using System.Data;
using System.Data.SqlClient;
using System.Net;

using System.Net.Sockets;
using System.Net.Mail;

namespace leeeego
{
    public class LegoMove : MonoBehaviour
{

    //Brick _brick;
    int _forward = 40;
    int _backward = 30;
    uint _time = 3000;

    public float moveSpeed;

    private Vector3 input;
    // Use this for initialization
    void Start()
    {

    }


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

        input = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
        input = new Vector3(2, 0, 2);
        //_brick = new Brick(new UsbCommunication());
        // _brick.BrickChanged += _brick_BrickChanged;
        //  _brick.ConnectAsync();
        //  _brick.DirectCommand.PlayToneAsync(100, 1000, 300);
    }

    //private void _brick_BrickChanged(object sender, BrickChangedEventArgs e)
    //{

    //}
}

}
namespace TheBrick
{
public class LegoMove : MonoBehaviour
{

    //Brick _brick;
    int _forward = 40;
    int _backward = 30;
    uint _time = 3000;

    public float moveSpeed;

    private Vector3 input;
    // Use this for initialization
    void Start()
    {

    }


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

        input = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
        //_brick = new Brick(new UsbCommunication());
        // _brick.BrickChanged += _brick_BrickChanged;
        //  _brick.ConnectAsync();
        //  _brick.DirectCommand.PlayToneAsync(100, 1000, 300);
    }

    //private void _brick_BrickChanged(object sender, BrickChangedEventArgs e)
    //{

    //}
}
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    Brick _brick;
    int _forward = 50;
    int _backward = 30;
    uint _time = 3000;
    int _x = 0;

    public MainWindow()
    {
        InitializeComponent();
    }

    private async void Window_Loaded(object sender, RoutedEventArgs e)
    {
        _brick = new Brick(new UsbCommunication());
        _brick.BrickChanged += _brick_BrickChanged;
        await _brick.ConnectAsync();
        await _brick.DirectCommand.PlayToneAsync(10, 1000, 300);



        TheBrick.Database1DataSet database1DataSet = ((TheBrick.Database1DataSet)(this.FindResource("database1DataSet")));
        // Load data into the table Table. You can modify this code as needed.
        TheBrick.Database1DataSetTableAdapters.TableTableAdapter database1DataSetTableTableAdapter = new TheBrick.Database1DataSetTableAdapters.TableTableAdapter();
        database1DataSetTableTableAdapter.Fill(database1DataSet.Table);
        System.Windows.Data.CollectionViewSource tableViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("tableViewSource")));
        tableViewSource.View.MoveCurrentToFirst();
    }

    private void _brick_BrickChanged(object sender, BrickChangedEventArgs e)
    {

    }

    private async void Move_up_Click(object sender, RoutedEventArgs e)
    {
        _brick = new Brick(new UsbCommunication());
        _brick.BrickChanged += _brick_BrickChanged;
        await _brick.ConnectAsync();
        await _brick.DirectCommand.PlayToneAsync(100, 1000, 300);
    }

    private async void button_Click(object sender, RoutedEventArgs e)
    {
        await _brick.DirectCommand.TurnMotorAtPowerForTimeAsync(OutputPort.B | OutputPort.C, _forward, _time, false);
        _x += 1;
        //label = _x;
    }

    private async void button1_Click(object sender, RoutedEventArgs e)
    {
        int a = Score.instace.CurrentScore;
        int b = 10;
        if (a == b)
        {
            await _brick.DirectCommand.TurnMotorAtPowerForTimeAsync(OutputPort.B | OutputPort.C, _forward, _time, false);
        }
    }


    private void textBox_TextChanged(object sender, TextChangedEventArgs e)
    {

    }

    private async void button2_Click(object sender, RoutedEventArgs e)
    {
        SqlConnection cn = new SqlConnection(global::TheBrick.Properties.Settings.Default.Database1ConnectionString);
        try
        {
            string sql = "INSERT INTO Table (moveLego,noiseLego) values(" + txtMove.Text + "," + txtNoise.Text + ")";
            SqlCommand exesql = new SqlCommand(sql, cn);
            cn.Open();
            exesql.ExecuteNonQuery();


        }
        catch
        {

        }
        finally
        {
            cn.Close();
        }
        _forward = Convert.ToInt32(txtMove.Text);
        _time = Convert.ToUInt32(txtNoise.Text);

        await _brick.DirectCommand.TurnMotorAtPowerForTimeAsync       (OutputPort.B     | OutputPort.C, _forward, _time, false);
    }

    private void dataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {

    }

    string serverIP = "localhost";
    int port = 8080;

    private async void button3_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            TcpClient client = new TcpClient(serverIP, port);//777777777777777777777777

            int bytecount = Encoding.ASCII.GetByteCount(txtMove.Text);

            byte[] sendData = new byte[bytecount];

            sendData = Encoding.ASCII.GetBytes(txtMove.Text);

            NetworkStream stream = client.GetStream();

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

            stream.Close();
            client.Close();
        }
        catch
        {
            _forward = Convert.ToInt32(txtMove.Text);
            _time = Convert.ToUInt32(txtNoise.Text);

            await _brick.DirectCommand.TurnMotorAtPowerForTimeAsync(OutputPort.B | OutputPort.C, _forward, _time, false);

        }




    }
    }
}`

【问题讨论】:

  • 你试过什么?有什么代码示例可以说明目前让您陷入困境的事情吗?
  • Unity 使用 Mono,它是 dotnet4.0 的一个子集,但只有最高 2.0 的 gaurentees 实现。这就是 linq 请求起作用的原因
  • 您可以尝试通过诸如此类的工具非正式地使用 async/await,nuget.org/packages/AsyncBridge.Net35 虽然没有保修。
  • 如果你确实想检查socket相关的东西,学习如何使用Wireshark等工具并分析网络数据包。
  • 真的我找不到视频来帮助解决套接字问题,我现在已经观看了超过 25 个问题。所以这就是为什么我问但我只关心如何将我的传感器数据发送给我在 Unity 中的程序(据我的信念),该程序不包括来自 .net 2.0“使用”的数据

标签: c# api sockets unity3d lego


【解决方案1】:

Unity 具有某种安全协议。所以只能连接 Unity 程序。 Photon 服务器是 Unity 上使用更高级别 C# 的一种可能的方法或包装器

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    • 2020-01-02
    相关资源
    最近更新 更多