通過從我的路由器設定轉發我的 IP 地址,我基本上已經通過互聯網與我的朋友建立了聯系……這是不可行的,因為很少有人愿意像我所做的那樣與他們的朋友一起玩游戲。那么如何使用鏡像網路解決方案統一實際進行 UDP 打孔(基本上是我手動對我的路由器所做的)...
uj5u.com熱心網友回復:
這個問題的一個常見解決方案是 WebRTC,它負責在引擎蓋下打孔。Unity 維護這個實作 WebRTC 的包。他們還提供了有關如何使用它的出色教程。它的螺母和螺栓是:
using UnityEngine;
using Unity.WebRTC;
public class MyPlayerScript : MonoBehaviour
{
RTCPeerConnection localConnection, remoteConnection;
RTCDataChannel sendChannel, receiveChannel;
private void Awake()
{
// Initialize WebRTC
WebRTC.Initialize();
// Create local peer
localConnection = new RTCPeerConnection();
sendChannel = localConnection.CreateDataChannel("sendChannel");
channel.OnOpen = handleSendChannelStatusChange;
channel.OnClose = handleSendChannelStatusChange;
// Create remote peer
remoteConnection = new RTCPeerConnection();
remoteConnection.OnDataChannel = ReceiveChannelCallback;
// register comms paths
localConnection.OnIceCandidate = e => {
!string.IsNullOrEmpty(e.candidate)
|| remoteConnection.AddIceCandidate(ref e);
}
remoteConnection.OnIceCandidate = e => {
!string.IsNullOrEmpty(e.candidate)
|| localConnection.AddIceCandidate(ref e);
}
localConnection.OnIceConnectionChange = state => {
Debug.Log(state);
}
}
//handle begin
IEnumerator Call(){
var op1 = localConnection.CreateOffer();
yield return op1;
var op2 = localConnection.SetLocalDescription(ref op1.desc);
yield return op2;
var op3 = remoteConnection.SetRemoteDescription(ref op1.desc);
yield return op3;
var op4 = remoteConnection.CreateAnswer();
yield return op4;
var op5 = remoteConnection.setLocalDescription(op4.desc);
yield return op5;
var op6 = localConnection.setRemoteDescription(op4.desc);
yield return op6;
}
//handle send messages
void SendMessage(string message)
{
sendChannel.Send(message);
}
void SendBinary(byte[] bytes)
{
sendChannel.Send(bytes);
}
//handle receive messages
void ReceiveChannelCallback(RTCDataChannel channel)
{
receiveChannel = channel;
receiveChannel.OnMessage = HandleReceiveMessage;
}
void HandleReceiveMessage(byte[] bytes)
{
var message = System.Text.Encoding.UTF8.GetString(bytes);
Debug.Log(message);
}
//handle end
private void OnDestroy()
{
sendChannel.Close();
receiveChannel.Close();
localConnection.Close();
remoteConnection.Close();
WebRTC.Finalize();
}
}
uj5u.com熱心網友回復:
我還找到了一種有用的方法來使用鏡像和史詩免費中繼來做到這一點。非常感謝其他答案,它確實有助于更好地理解我需要搜索和使用的內容!
uj5u.com熱心網友回復:
您可以使用 Photon Bolt 或 Photon Fusion 讓玩家在他們的本地機器上托管游戲,如我的世界等。 Photon 提供中繼并嘗試使用 STUN 通過 UDP 建立與主機的直接對等連接。PUN2 也是一個不錯的選擇,雖然我更喜歡 Photon Bolt/Fusion——它不是一個簡單的 RPC 框架,而是更面向程式員的。此外,PUN 不做任何 STUN 直接對等連接,它將始終被中繼。Photon Bolt 和 Fusion 將首先嘗試 STUN 直接對等連接,然后在必要時回退到中繼。它已經存在多年,是最好的選擇。
當然,您可以使用 Mirror 開發 Unity 游戲(盡管沒有內置中繼),但它的設定和使用并不像 Photon Bolt/Fusion 那樣容易,而且它們不提供中繼。正如有人提到的,您可能能夠以某種方式將某些東西組合在一起,但是是的 - 不推薦。
呃,是的,不要在 Unity 游戲中使用 WebRTC(或者可能除了流媒體音樂/視頻之外的任何東西,就像它是為了誠實而制作的)。
Unity 的 MLAPI 正在“開發中”,他們的最后一個 API 突然被“棄用”了,所以我不會使用它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/339687.html
標籤:统一3d
