Skip to content

Instantly share code, notes, and snippets.

@rdeioris
Created February 28, 2020 16:19
Show Gist options
  • Save rdeioris/b1d4ee0a13f5b47b04c76f9fd701d43a to your computer and use it in GitHub Desktop.
Save rdeioris/b1d4ee0a13f5b47b04c76f9fd701d43a to your computer and use it in GitHub Desktop.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Net;
using System.Net.Sockets;
using System;
using System.IO;
public class PacketManager : MonoBehaviour
{
[SerializeField]
string address;
[SerializeField]
int port;
[SerializeField]
uint mySelfId = 0;
[SerializeField]
GameObject mySelfObject = null;
[SerializeField]
GameObject enemyPrefab = null;
Dictionary<uint, GameObject> players;
Socket socket;
IPEndPoint serverEndPoint;
byte[] data;
// Start is called before the first frame update
void Start()
{
players = new Dictionary<uint, GameObject>();
players[mySelfId] = gameObject;
socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
serverEndPoint = new IPEndPoint(IPAddress.Parse(address), port);
socket.Blocking = false;
data = new byte[16];
}
// Update is called once per frame
void Update()
{
for (int i = 0; i < 100; i++)
{
int rlen = -1;
try
{
rlen = socket.Receive(data, data.Length, SocketFlags.None);
}
catch
{
break;
}
if (rlen == 16)
{
//MemoryStream ms = new MemoryStream(data, 0, rlen);
//BinaryReader br = new BinaryReader(ms);
uint playerId = BitConverter.ToUInt32(data, 0);
float playerX = BitConverter.ToSingle(data, 4);
float playerY = BitConverter.ToSingle(data, 8);
float playerZ = BitConverter.ToSingle(data, 12);
if (playerId == mySelfId)
continue;
Vector3 playerPosition = new Vector3(playerX, playerY, playerZ);
if (!players.ContainsKey(playerId))
{
GameObject newPlayer = GameObject.Instantiate(enemyPrefab, playerPosition, Quaternion.identity);
newPlayer.GetComponentInChildren<TextMesh>().text = playerId.ToString();
players[playerId] = newPlayer;
newPlayer.name = string.Format("Player {0}", playerId);
}
else
{
players[playerId].transform.position = playerPosition;// Vector3.Lerp(players[playerId].transform.position, playerPosition, Time.deltaTime);
}
}
}
Vector3 myPosition = mySelfObject.transform.position;
/* byte[] dataId = BitConverter.GetBytes(mySelfId);
byte[] dataX = BitConverter.GetBytes(myPosition.x);
byte[] dataY = BitConverter.GetBytes(myPosition.y);
byte[] dataZ = BitConverter.GetBytes(myPosition.z);
dataId.CopyTo(data, 0);
dataX.CopyTo(data, 4);
dataY.CopyTo(data, 8);
dataZ.CopyTo(data, 12);*/
MemoryStream memoryStream = new MemoryStream();
memoryStream.Position = 0;
UnityBinaryWriter ubw = new UnityBinaryWriter();
ubw.Write(mySelfId);
ubw.Write(myPosition);
byte[] outData = memoryStream.ToArray();
socket.SendTo(outData, outData.Length, SocketFlags.None, serverEndPoint);
}
}
class UnityBinaryWriter : BinaryWriter
{
public void Write(Vector3 vec)
{
Write(vec.x);
Write(vec.y);
Write(vec.z);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment