feat: update method communicate with python

master
tiendat3699 2024-04-16 15:47:19 +07:00
parent e19dad4b7d
commit ef010cbc37
13 changed files with 136 additions and 121 deletions

View File

@ -267,7 +267,7 @@ PrefabInstance:
m_Modifications:
- target: {fileID: 5011611157645887697, guid: 7a832c1c97ca15e40bad68fa0ddb5007, type: 3}
propertyPath: m_Name
value: Data Receive
value: Upb Socket
objectReference: {fileID: 0}
- target: {fileID: 7936842462643178004, guid: 7a832c1c97ca15e40bad68fa0ddb5007, type: 3}
propertyPath: m_LocalEulerAnglesHint.x

View File

@ -5,10 +5,12 @@ using UnityEngine;
namespace GadGame.MiniGame
{
public class Bomb : MonoBehaviour, ICollect
public class Bomb : MonoBehaviour, ICollect, IPoolable
{
[SerializeField] private int _reduceScore;
[SerializeField] private Rigidbody2D _rb;
private bool _inUsed;
public void Init(float gravityScale = 1)
{
@ -17,7 +19,7 @@ namespace GadGame.MiniGame
private void FixedUpdate()
{
if (_rb.position.y <= -10)
if (_inUsed && _rb.position.y <= -10)
{
this.Release();
}
@ -28,5 +30,15 @@ namespace GadGame.MiniGame
GameManager.Instance.UpdateScore(-_reduceScore);
this.Release();
}
public void OnGet()
{
_inUsed = true;
}
public void OnRelease()
{
_inUsed = false;
}
}
}

View File

@ -4,10 +4,12 @@ using UnityEngine;
namespace GadGame.MiniGame
{
public class Item : MonoBehaviour, ICollect
public class Item : MonoBehaviour, ICollect, IPoolable
{
[SerializeField] private int _score;
[SerializeField] private Rigidbody2D _rb;
private bool _inUsed;
public void Init(float gravityScale = 1)
{
@ -16,7 +18,7 @@ namespace GadGame.MiniGame
private void LateUpdate()
{
if (_rb.position.y <= -10)
if (_inUsed && _rb.position.y <= -10)
{
this.Release();
}
@ -27,5 +29,15 @@ namespace GadGame.MiniGame
GameManager.Instance.UpdateScore(_score);
this.Release();
}
public void OnGet()
{
_inUsed = true;
}
public void OnRelease()
{
_inUsed = false;
}
}
}

View File

@ -72,7 +72,7 @@ namespace GadGame.MiniGame
public void PlayerControl()
{
//640x480;
var inputData = DataReceiver.Instance.DataReceived.PosPoint;
var inputData = UdpSocket.Instance.DataReceived.PosPoint;
var inputNormalize = new Vector2((inputData.x - 213.33f)/ 213.33f, inputData.y / 480);
var input = new Vector2
{

View File

@ -1,101 +0,0 @@
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using GadGame.Singleton;
using Newtonsoft.Json;
using UnityEngine;
namespace GadGame.Network
{
public class DataReceiver : PersistentSingleton<DataReceiver>
{
[SerializeField] private int _port = 3000;
[SerializeField] private ReceiverData _dataReceived;
private bool _receiving = true;
public ReceiverData DataReceived => _dataReceived;
private Thread _receiveThread;
private TcpListener _listener;
private void Start()
{
try
{
_listener = new TcpListener(IPAddress.Any, _port);
_listener.Start();
_receiving = true;
Debug.Log("Listening for data from Python...");
// Start a new thread to handle incoming data
Thread receiveThread = new Thread(GetReceiveData)
{
IsBackground = true
};
receiveThread.Start();
}
catch (Exception e)
{
Debug.LogError("Error starting listener: " + e.Message);
}
}
private void GetReceiveData()
{
while (_receiving)
{
try
{
var client = _listener.AcceptTcpClient();
var stream = client.GetStream();
var buffer = new byte[1024];
var bytesRead = stream.Read(buffer, 0, buffer.Length);
var jsonData = Encoding.ASCII.GetString(buffer, 0, bytesRead);
_dataReceived = JsonConvert.DeserializeObject<ReceiverData>(jsonData, new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore,
MissingMemberHandling = MissingMemberHandling.Ignore
});
}
catch (Exception e)
{
Debug.Log(e);
throw;
}
}
}
public void SendDataToPython(string data)
{
try
{
string jsonData = JsonConvert.SerializeObject(data);
IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, _port);
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(endPoint);
// Convert string data to bytes
byte[] byteData = Encoding.UTF8.GetBytes(jsonData);
// Send data to Python
socket.Send(byteData);
}
catch (Exception e)
{
Debug.LogError("Error sending data to Python: " + e.Message);
}
}
void OnDestroy()
{
_receiving = false;
if (_listener != null)
{
_listener.Stop();
}
}
}
}

View File

@ -0,0 +1,92 @@
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using GadGame.Singleton;
using Newtonsoft.Json;
using UnityEngine;
namespace GadGame.Network
{
public class UdpSocket : PersistentSingleton<UdpSocket>
{
[SerializeField] private string _ip = "127.0.0.1";
[SerializeField] private int _receivePort = 8000;
[SerializeField] private int _sendPort = 8001;
[SerializeField] private ReceiverData _dataReceived;
private bool _receiving = true;
public ReceiverData DataReceived => _dataReceived;
private Thread _receiveThread;
private UdpClient _client;
private IPEndPoint _remoteEndPoint;
private void Start()
{
// Create remote endpoint
_remoteEndPoint = new IPEndPoint(IPAddress.Parse(_ip), _sendPort);
// Create local client
_client = new UdpClient(_receivePort);
// local endpoint define (where messages are received)
// Create a new thread for reception of incoming messages
_receiveThread = new Thread(new ThreadStart(ReceiveData))
{
IsBackground = true
};
_receiveThread.Start();
_receiving = true;
// Initialize (seen in comments window)
Debug.Log("UDP Comms Initialised");
}
private void ReceiveData()
{
while (_receiving)
{
try
{
IPEndPoint anyIP = new IPEndPoint(IPAddress.Any, 0);
byte[] data = _client.Receive(ref anyIP);
string jsonData = Encoding.UTF8.GetString(data);
_dataReceived = JsonConvert.DeserializeObject<ReceiverData>(jsonData, new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore,
MissingMemberHandling = MissingMemberHandling.Ignore
});
}
catch (Exception e)
{
Debug.Log(e);
throw;
}
}
}
public void SendDataToPython(string message)
{
try
{
byte[] data = Encoding.UTF8.GetBytes(message);
_client.Send(data, data.Length, _remoteEndPoint);
}
catch (Exception err)
{
print(err.ToString());
}
}
void OnDestroy()
{
_receiving = false;
if (_receiveThread != null)
_receiveThread.Abort();
_client.Close();
}
}
}

View File

@ -14,7 +14,7 @@ namespace GadGame.State.MainFlowState
public override void Update(float time)
{
if (!DataReceiver.Instance.DataReceived.PassBy)
if (!UdpSocket.Instance.DataReceived.PassBy)
{
_noPassByTimer += Time.deltaTime;
if (_noPassByTimer >= 10)

View File

@ -19,7 +19,7 @@ namespace GadGame.State.MainFlowState
{
if (time >= 2)
{
if (!DataReceiver.Instance.DataReceived.PassBy)
if (!UdpSocket.Instance.DataReceived.PassBy)
{
Runner.SetState<IdleState>();
return;
@ -27,20 +27,20 @@ namespace GadGame.State.MainFlowState
switch (_warned)
{
case false when !DataReceiver.Instance.DataReceived.Engage:
case false when !UdpSocket.Instance.DataReceived.Engage:
_warned = true;
PopupManager.Instance.Show("Come Back", 5, () =>
{
Runner.SetState<ViewedState>();
});
return;
case true when DataReceiver.Instance.DataReceived.Engage:
case true when UdpSocket.Instance.DataReceived.Engage:
_warned = false;
PopupManager.Instance.Hide();
return;
}
}
if (!DataReceiver.Instance.DataReceived.Ready) _readyTimer = 0;
if (!UdpSocket.Instance.DataReceived.Ready) _readyTimer = 0;
_readyTimer += Time.deltaTime;
if (_readyTimer >= 5)
{

View File

@ -14,7 +14,7 @@ namespace GadGame.State.MainFlowState
public override void Update(float time)
{
if(time < 2) return;
if (DataReceiver.Instance.DataReceived.PassBy)
if (UdpSocket.Instance.DataReceived.PassBy)
{
Runner.SetState<PassByState>();
}

View File

@ -14,12 +14,12 @@ namespace GadGame.State.MainFlowState
public override void Update(float time)
{
if (time < 2f) return;
if (!DataReceiver.Instance.DataReceived.PassBy)
if (!UdpSocket.Instance.DataReceived.PassBy)
{
Runner.SetState<IdleState>();
return;
}
if (DataReceiver.Instance.DataReceived.OnVision)
if (UdpSocket.Instance.DataReceived.OnVision)
{
Runner.SetState<ViewedState>();
}

View File

@ -12,7 +12,7 @@ namespace GadGame.State.MainFlowState
public override async void Enter()
{
DataReceiver.Instance.SendDataToPython("{playingGame: true}");
UdpSocket.Instance.SendDataToPython("{playingGame: true}");
await LoadSceneManager.Instance.LoadSceneWithTransitionAsync(Runner.SceneFlowConfig.GameScene.ScenePath);
_gameManager = GameManager.Instance;
_gameManager.OnEnd += OnEndGame;
@ -22,7 +22,7 @@ namespace GadGame.State.MainFlowState
{
switch (_warned)
{
case false when !DataReceiver.Instance.DataReceived.Engage:
case false when !UdpSocket.Instance.DataReceived.Engage:
{
_leaveTimer += Time.deltaTime;
if ( _leaveTimer >= 5)
@ -34,7 +34,7 @@ namespace GadGame.State.MainFlowState
}
return;
}
case true when DataReceiver.Instance.DataReceived.Engage:
case true when UdpSocket.Instance.DataReceived.Engage:
_warned = false;
_gameManager.Resume();
PopupManager.Instance.Hide();
@ -44,7 +44,7 @@ namespace GadGame.State.MainFlowState
public override void Exit()
{
DataReceiver.Instance.SendDataToPython("{playingGame: false}");
UdpSocket.Instance.SendDataToPython("{playingGame: false}");
}
private void OnEndGame()

View File

@ -13,12 +13,12 @@ namespace GadGame.State.MainFlowState
public override void Update(float time)
{
if(time < 2) return;
if (!DataReceiver.Instance.DataReceived.PassBy)
if (!UdpSocket.Instance.DataReceived.PassBy)
{
Runner.SetState<IdleState>();
return;
}
if (DataReceiver.Instance.DataReceived.Engage)
if (UdpSocket.Instance.DataReceived.Engage)
{
Runner.SetState<EngageState>();
}