https://github.com/StinkySteak/unity-webgl-server
You might want to use this plugin to simplify your workflow
1 messages · Page 25 of 1
https://github.com/StinkySteak/unity-webgl-server
You might want to use this plugin to simplify your workflow
Hey Guys! I'm looking for someone who has expeirence with the networking system "Photon Pun 2". I want to implement some features into my multiplayer fps game, but I am having issues with getting the game to do simple things such as ending the game after a set period of time, and spawning the players when a different map is chosen. If anyone wants to help me, you can simply dm me and I will try to give you as much info as I can :)
If you have a question, post it here. #854851968446365696 how to ask questions. If you are looking for paid or !collab help:
We do not accept job or collab posts on discord.
Please use the forums:
• Commercial Job Seeking
• Commercial Job Offering
• Non Commercial Collaboration
there is no process to kill simplewebserver
if there is no process then its not running
It was running through service worker, every time I access http://locahlost:8017 I could play the build, even closing all Unity .exe. So I had to unregister the ServiceWorker through browser inspector
I use the old taskmanager, maybe it doesnt show on it, let me try with that you are using
okay, now it is showing even on old one and ctrl+c is working to kill the server on CMD. Maybe I did something wrong at first time. Now it is working properly
What do you mean? in NGO, IsServer is still available.
Hey guys, anyone else used Photon and had this same issue in the "GetDrawerTypeForType()" function?
I saw here the latest patch note saying they fixed it, so i need to use an older unity version?
https://doc.photonengine.com/quantum/current/getting-started/release-notes/release-notes-2-1
btw i haven't done nothing yet, just imported the custom package photon fusion 2 from their documentation
Fixed: GetDrawerTypeForType() errors for Unity 2022.3.23+ The context is now exposed in property, similarly to and properties to be able to ch
Photon Fusion question: I have encountered the below issue, can anyone help me?
How long is it considered rude in this community to repost a question to see if other people might get eyes on it? Looking for insight on this but don't want to annoy people and i don't see anything clearly in the rules regarding it. I have done my research and read all the docs and demos, it's not a question of "how" but "why" that i'm looking for
It is a known problem (API change in Editor) which now has a fix in the latest version.
It is fixed in the Quantum SDK v2.1.8.1.
Are you saying you updated and it didn't fix the issue?
Most people won’t scroll up more than a day or 2 pages. Whichever comes first.
it’s likely though that in a low activity channel your question was seen and the knowledge is just not readily available in this community
I would not expect a question to work like a classified ad for ‚help needed‘
So between those things, you judge for yourself. Nobody will haunt you for an honest question that is repeated a few times.
I would ask this question over on #1062393052863414313 but I don't know if anyone other than the Unity devs themselves can answer "why". But they are fairly active over there
Photon Issue with this followhand script not syncing with other clients on my screen
As in on my view the item follows my hand but for others on my screen the item is not and is stuck at its original position
Pastebin.com is the number one paste tool since 2002. Pastebin is a website where you can store text online for a set period of time.
Hi Guys, it would be awesome if you can help me with my questions. It is the first time for me building a multiplayer game and using netcode for gameobjects, i am really confused for now.^^
1.Right now the CreateMap method get called after every change at the list, so after the .clear and after every .Add . Is possible to send it just after the foreach?
2. I get one of two error. Right now it is this one: ObjectDisposedException: The Unity.Collections.NativeList`1[System.Byte] has been deallocated, it is not allowed to access it .If I change something I get the error that I don't use a correct dispose. Can someone tell me what I do wrong?
3. If I want to create this list 5-6 times per second and send it. Is it better to use a NetworkList or an RPC?
I am really happy for every support. Thanks in advance.
public override void OnRoomListUpdate(List<RoomInfo> roomList)
{
Debug.Log("OnRoomListUpdate called.");
if (Time.time >= nextUpdateTime)
{
UpdateRoomList(roomList);
nextUpdateTime = Time.time + timeBetweenUpdates;
}
}
private void UpdateRoomList(List<RoomInfo> roomList)
{
foreach (RoomItem item in roomItemsList)
{
Destroy(item.gameObject);
}
roomItemsList.Clear();
foreach (RoomInfo room in roomList)
{
RoomItem newRoom = Instantiate(roomItemPrefab, _content);
newRoom.SetRoomName(room.Name);
roomItemsList.Add(newRoom);
}
}
}```
Why is the function `OnRoomListUpdate` not called?
yep it didn't fix it.
But i saw a post that a guy changed a line on Unity.Editor and it worked just fine 🙂
You'll need to make sure that there is only one active camera in the scene. Disable any cameras attached to other players besides the local player
Yes. Cameras should not be networked
Hello,
I'm using UGS multiplay and matchmaking service, with mirror.
I'm facing an issue where the client got an warning message attached in Image.
Here is the code using which I'm starting client and server using mirror
The network manager settings.
Does anyone have idea about this??
The camera should not have a network object.
You should be setting the IP and port from the ticket payload. The server should be automatically starting
Yes I'm setting ip and port using image 1, and calling server connect from client using image 2
In console events tab I got an error see if this helps.... 😕
You can do this... Attach the camera initially to player prefab. Then pass its reference. Now you can deatach camera
You are not running ServerQueryHandler.UpdateServerCheck() in Update
https://docs.unity.com/ugs/en-us/manual/game-server-hosting/manual/sdk/game-server-sdk-for-unity#Start_server_query_handler
Can someone explain (maybe with an example) how to use connection data events for client connect/disconnect as apposed to the callback contexts?
It kind of depends whether you are receiving it on the server or the clients.
https://docs-multiplayer.unity3d.com/netcode/current/advanced-topics/connection-events/
When you need to react to connection or disconnection events for yourself or other clients, you can use NetworkManager.OnConnectionEvent as a unified source of information about changes in the network. Connection events are session-mode agnostic and work in both client-server and distributed authority contexts.
@sharp axle I've never used events/actions before, so I was wondering what, for example, the equivalent of OnClientConnected Callback would be
OnConnectionEvent
yes, but how do I actually code it?, like what's the syntax?
the documentation only has what the enum and connection event data can be by listing it's options, without an example
@sharp axle
It's the same as the old connection callbacks except there is only one you need now
https://docs-multiplayer.unity3d.com/netcode/current/components/networkmanager/#connection-notification-manager-example
The NetworkManager is a required Netcode for GameObjects component that has all of your project's netcode-related settings. Think of it as the central netcode hub for your netcode-enabled project.
Here is how you sub and unsub from events
https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/events/how-to-subscribe-to-and-unsubscribe-from-events
NetworkManager.OnConnectionEvent += ClientConnected;
void ClientConnected(ConnectionEventData data)
{
//do stuff
}
@sharp axle like that?
I guess my brain's fried, because I don't know how to get the information out of the event
nevermind I got it
Yes. data.EventType for the event that happened. and data.ClientId for (dis)connecting client. PeerClientIds you can ignore
@sharp axle I have a new question now, when I start as host sometimes it will start the host but not trigger the connection data callback to spawn a player prefab when a client connects (in this case the host's client to its server)
can the client connection be subscribed to before StartHost() is called?
You should check for the PeerConnected event type there
peer connected for itself?
@sharp axle does that mean that the server part and the client part are considered peers to each other dispite being on the same device
I might be wrong about that. I don't think I ever checked for the host connecting to itself
the host starts fine, but sometimes it doesn't spawn the player prefab when the connection event gets called for client connect
I start the host on a button, but I subscribe to the connection data on awake
@sharp axle should I subscribe in a different function?
try it in Start(). NetworkManager.Singleton will be sure to be initialized by then
...did not work, all i got was the warning that you can't make another host instance while one is running, when I tried pressing the button again after it didn't do anything
I also put print logs, they didn't run either, so it must not be subscribed to
I meant subscribing to NetworkManager.OnConnectionEvent in Start()
I did that
I just start the host on a button
but here's the wierd thing, I can stop playmode, start it again, and do the exact same thing and it spawns the player prefab just fine
I tried with and without the singleton instance, no change
it always fails first then spawns correctly
@sharp axle do network objects that are already in the scene have a OnNetworkSpawn call?
They do. It's what I use to spawn players. I have a playerManager in scene
As long as you are changing scenes with NetworkManager.SceneManager.LoadScene(), then in scene objects will be spawned. If they are active in the scene
Hey so I was following a multiplayer tutorial and things already fell apart by step one lmao. I installed the netcode for gameobjects package but I can't add the network manager script to anything for some reason.
Like nothing with network in the name is even appearing
If you don't have any console errors, then you might just need to restart Unity
Oh I think my version of unity was just too old
Is this code looks fine?? I assigneed it in start services method image 1
private void Update()
{
if(serverQueryHandler != null)
{
serverQueryHandler.UpdateServerCheck();
}
}
If i get/read a network variable .value , does this send a request / impact networking performance (asking because i do that every second on hundreds of units in my game)
no. data is only sent when it is changed. and it can only be changed by the server or its owner
I need some help syncing server/client data, specifically network lists and player names
so the set player name server rpc is called from the player when it spawns
[ServerRpc(RequireOwnership = false)]
public void SetPlayerNameServerRpc(ulong id)
{
Players.Insert((int)id, "Player " + (id + 1));
UpdatePlayerNamesServerRpc();
}
[ServerRpc(RequireOwnership = false)]
void UpdatePlayerNamesServerRpc()
{
foreach (var client in NetworkManager.Singleton.ConnectedClientsList)
{
var playerObject = client.PlayerObject;
if (playerObject != null)
{
var player = playerObject.GetComponentInChildren<CarNetworkVariables>();
if (player != null)
{
player.playerName.text = Players[(int)client.ClientId].ToString();
}
}
}
}
The player names sync on the host but not on the clients, despite changing each client's own text element
Can the server not change individual client's game objects?
serverRPCs are one way only. It would need to send a clientRPC. Or you can make the player name a network variable.
There is also the new [RPC] system if you don't want to use network variables
I synced it client side by subscribing to the network list's OnListChanged event
I guess I sort of forgot that clients will sync themselves reguardless of it they are the current owned client
How do I remove clients from the network manager list, like when I disconnect a client, then add a new one, it treats it as if the previous client is still there
the client id just keeps going up
client ID will always increment
ok
When players join the game after its been created rather than it being created and everyone connecting at once, it dosent sync the weapons
I recieve an error here on line 176, Object not set to an instance of an object
Hello there has anyone here used multiplayer play mode in the unity 6 prieview, when i make a 2nd instance of the editor i cannot maximize it.It says like its minimized
Which line is 176?
Try this fix if your OS language is set to anything other than English
https://forum.unity.com/threads/mppm-error-found-out-of-date-assets.1568950/#post-9746005
Thx will try that
Parrelsync is killing me over here
Hello, I have a NetworkManager component setup in my main scene with the player prefab I want to spawn. Everything works fine when running as a host but when connecting as a client the player prefab doesn't spawn. Can't find much documentation and I had assumed that the NetworkManager would spawn the player prefab when connecting as a client or host. Do I have to setup my own RPCs to spawn my player on the server and client when a new client connects? If so are there any resources on how to spawn a network object on both the client and server because again I've done some googling but can't find any useful documentation
the if !photonview line
i believe its happening because the player joins late to the photon room
If you are using NGO, then the docs are here
https://docs-multiplayer.unity3d.com/netcode/1.9.1/components/networkmanager/
The NetworkManager is a required Netcode for GameObjects (Netcode) component that has all of your project's netcode related settings. Think of it as the "central netcode hub" for your netcode enabled project.
The player object will spawn automatically if set in the network manager. make sure the client is set to connect to the IP of the host
@sharp axle Thanks it worked perfectly
But from the looks of it my player 2 editor is still bugged but i can use 3 and 4
for some reason
Yeah, I got that issue too
Is fish net good for fast paced FPS shooter?
I managed to also find some alternative to multiplayer play mode on the asset store
Completely free
Called Multiplay
Link?
Is it better than NGO?
I think NGO lacks important things like client side prediction
I have a few questions for you
Hey there sorry my discord wasent refreshing so i couldent hear any notifications or calls
I dmed you
You should check out NGO 1.9.1. while not a full client prediction system, the anticipation system will get you about 80% there
What would you recommend? Fishnet or NGO?
Target game: FPS fast paced shooter
I am all in on NGO, adding physics rollback (if you even need it) is doable. Fishnet seems fine too. I don't know what they have locked behind the paid version though. If you already know DOTS or are willing to learn then check out Netcode for Entities. It also has full client prediction built in.
Dots is itself complicated, plus Netcode for entities is overkill
But NGO...
That's nice! Is anticipated network transform server handled?
Because I currently have client network transform
It is server authoritative, yes
But it lets the clients move with no lag
That's great 🔥
So it's suitable for FPS shooters?
There is no reason why not
You are talking to a NGO Moderator, and the result is bias to NGO
FPS Shooter is go for Fusion or Netick
A lot of VR Shooter Titles has been using it
So, Fusion, Netick or Fishnet
I will explore their features
are you a solo developer? how much is your budget?
Yes, budget near 0, I'm a student
Fishnet feature-wise is better than Mirror. However Fishnet is actually banned from the unity discord.
Fishnet author is a manipulative person, better to avoid it
yea, its made using fusion
How i can make Mobile contols in Simple Fps Fusion 2 sample project..
I try with joystick pack and simple input buttons
@teal cedar
Fun fact from fishnet: I got banned from their discord server without notification because I publish a udemy course teaching other netcode tutorial.
Like how anti-competitive you could be
That's quite toxic from them tbh
If you easily posted another netcode benchmark number that is better than fishnet, your message will be removed
Where can I go to learn more about advanced multiplayer techniques? E.g. how do I coordinate many host servers to provide a seamless massive world, like WoW? How do I design a game like Helldivers that has thousands if not hundreds of thousands of instances per party of 4 — how do I handle spinning up and spinning down servers?
The more advanced stuff like that.
By trying to do it from scratch yourself. The server coordination and management part of it, not the gameplay-netcode. It shouldn't be very hard.
I've not played Helldivers, is it client-auth? Do you see cheaters regularly?
It's not really something you would build from scratch by yourself(unless you are already a server engineer). Your server hosting provider would handle spinning up new servers as needed. MMOs require entire teams working just on the servers
I don't know if I can post links but you can find a load of info at gamenetcode.com
You’re allowed to post links but yea let me check out if that website has kinda what I’m looking for.
“Your server hosting provider would handle spinning up new servers as needed” The tricky part is telling the server hosting provider when to spin up new servers, and how to handle spinning them down, if you understand what I’m saying. That’s the piece I’d like some patterns or manuals on how to make.
For Unity Server Hosting you don't have to. It keeps track of how many players are in a game and when all servers are full, then it start a new one when the next player tries to join. When the last player on a server disconnects, then it will shut that server down. I'm sure other hosting providers like amazon works the same
What if I have a persistent world, like in an mmorpg?
That would require self hosting. You lease servers in a data center(s) When you're servers get full you buy new ones. It's hellaciously expensive. It's part of why you don't see them being made anymore.
Ok let’s say I have no issues with capital… so what patterns exist to support an mmorpg?
There aren't enough MMOs made for there to be patterns
(using photon pun 2) any idea why instead of joining a private room, i just join a random instead?
Are there any reliable benchmark tests of unity networking solutions (mirror, fishnet, photon fusion...)
Because every benchmark test I found is heavily biased
I think the best you can do is run these benchmarks locally and measure for yourself
https://github.com/StinkySteak/unity-netcode-benchmark
Im trying to detect when the host disconnects from the cient, but this code gets called on the host before it leaves, but not on the client
void Connection(NetworkManager networkManager, ConnectionEventData data)
{
if (data.EventType == ConnectionEvent.ClientDisconnected && data.ClientId == 0)
{
print("host left");
ResetGame();
}
}
this is being called by subscribing to the NetworkManager.Singleton.OnConnectionEvent
So in other words, how do I get the client to detect when the server goes down
On the client, ClientDisconnected event is always local so client id will be itself
Server id is always 0. Peer disconnected will get received on the clients when another client disconnects
ok so... how do i get when the server shuts down rather than a client id
Client disconnect should fire for that too
so something like this?
if (IsClient && data.EventType == ConnectionEvent.PeerDisconnected && data.ClientId == 0)
{
ResetGame();
}
No, just ClientDisconnected and no need to check for clientid there either
but how will the clients know if its the server/host or just another client, without specifying?
ClientDisconnected is always local for the clients
If it's another client it will be peer disconnected
but the server won't be local for any client other than the host
I need this to run on clients to detect when the server/host shuts down/disconnects, so it wouldn't be a client disconnected would it?
because that would be local right?
Yes When the server shuts down the clients will all get sent the client disconnect event.
through connection events or OnClientDisconnected?
Can’t stop thinking about this response… So in your world, how many games of a genre (like mmorpg) have to be created before someone realizes there are patterns for the genre?
Are patterns from one genre (like oRPGs) applicable to other genres? Why or why not?
https://en.m.wikipedia.org/wiki/List_of_massively_multiplayer_online_role-playing_games
This is a selected list of massively multiplayer online role-playing games (MMORPGs).
MMORPGs are large multi-user games that take place in perpetual online worlds with a great number of other players. In most MMORPGs each player controls an avatar that interacts with other players, completes tasks to gain experience, and acquires items. MMORPG...
To me there are gameplay patterns which are just genres. And then there are programming patterns. I've yet to find any consensus on MMO programming patterns or even MMO architecture for that matter. What worked for Wow 15 - 20 years ago is not gonna work for some indie dev today.
If you find any good resources on MMO development, I would super interested in it
If I find such a resource I can share.
I saw your name on a comparison on the forums and then saw this message. I asked about this and they said you were banned for "intentionally spreading misinformation". Do you have any proof of what you say or are you slandering to promote your preferred network?
Thanks for asking.
intentionally spreading misinformation
I did not 100% spread any misinformation
I also do not promote any preferred network at all. I give network based on their needs
yk punfish is a manipulative guy
yes you seem to not like them I dont care about that. do you have proof of what you said
umm.. say what doe
If you dont have proof Im inclined to believe you were properly banned.
i have no proof whatsoever, because I dont do anything
Alright let me tell you how I and possibly others see it then
you are saying they banned you for making a tutorial or something of another network, but you have no proof of this. they say youre banned for intentionally spreading misinformation. If you are unable to proof what you said its more likely you were in factual banned for misinformation.
they say youre banned for intentionally spreading misinformation
do they proof of this tho?
Its like both of us dont have anyproof. but punfish create a promising story of it
@visual cypress You are spreading misinformation, where is the proof you dont spread misinformation?
thats like it
He turns a condition where he is losing by creating a fake scenario, where the feature doesnt exist at all
how you can more manipulaitve be
I didnt really see anything on their server talking bad of you. I also see you talking about other networks but no one seems to care. You are saying you were banned for making a tutorial which just sounds ridiculous. They have a bunch of content creators in their server for all parts of Unity. You are very apparently upset about something and will say anything to make them look bad. Be the bigger person and just stop.
You are saying you were banned for making a tutorial which just sounds ridiculous
To be exact, I made a udemy course teaching Netick in Unity.
Netick and Fishnet seems had a beef in the past. and somehow I also got dragged into the problem
Pretty much everybody who has relation with Netick is banned
I wonder why...
Do you even know the story of fishnet?
It's not a story the Jedi would tell you...
🙈
LMAO
dude, the fishnet dev is banned in this server for creating fake accounts
imagine defending him 😰
@haughty heart sorry to bother you, is unity going to take action against Fishnet developer?
why is their asset still up in the asset store?
Let me guess you are also banned from their discord.
You do not need to tag me please

please inform yourself about what you are trying to discuss
I dont even know what you are trying to discuss
don't defend people who are proven to do bad things
Id expect some sort of proof with all these claims. and why are you sending me unsolicited pictures?
i am not sending you anything, this is not your private messages, this is a public space 
change the subject, nice
You just did it again. I dont have any proof though. But everyone should take my word for it because you dont like me.
proof for what
yea let's go to fishnet dev house and grab his PC
and see what he's doing there
How can you not have proof of something that happened on the internet??
browse this server for "proof"
he wouldn't be banned if he was innocent
Im surprised your hateful group isnt prosecuted for slander.
no one ever got banned for creating promotion fake accounts ever, except for him
YOU ARE BANNED! LOL!!!
you are FirstGearGames?
I guess if you dont have haters you arent doing something right
let me tell the mods about you
yea, that's why Photon are banned too, duh
their solutions are 10000 times better than that shovelware
Photon is banned?
of course not 
people who do things the right way won't be banned
as simple as that
Hey I'm having a bit of trouble understanding how to make things work client side. Like I've got a camera which follows some inputs that preexists in the scene and it works fine for the host but it doesn't work at all for the client despite existing in the scene prior and its transform isn't networked so it should be different on both sides.
You'll need to make sure that the camera has the references to those in scene objects when it spawns in
The camera doesn't spawn in, it already exists and the players sends it a reference to them when they spawn in.
@blissful jayI will dm you if thats okay
go ahead
For mods reading this, this account @visual cypress never sent a msg in this server
This account interacted today for the first time to defend FishNet, the networking solution asset made by the notorious developer who makes fake accounts to promote his product.
Therefore it's very very likely this is an alt account of FirstGearGames/Punish(FishNet author)
No, Unity won't be removing their asset from the store unless they violate the stores policies in some way. The fact that the owner makes fake accounts is weird, and the original owner was banned for specific reasons, but that's all.
If someone wants to argue the use of Fishnet, they're free to do so as long as it doesn't turn into a shouting match.
I think they are violating the store policies too
they advertise their asset as free, but it contains pay-walled features
You can report their account from their publisher page on the store, then. We have no authority over that, here.
I did, a year ago, but it's still up
the asset store team is under-staffed
Well, you can only wait then. We aren't the asset store team.
Anyone try bobsis tutorials?
Hey so for some reason the characters aren't appearing on the client side despite the fact that they have their transform and network object. It was working like I minute ago and I didn't do anything to change it I have no idea why it isn't working now T_T
Are you seeing the characters in the scene hierarchy on the client?
No
How are your players getting spawned? And are you seeing any errors in the console?
When the camera controller for the character is added to the scene as the network player object it sends a server rpc to tell a script which only exists on the server side to spawn the player. There's no errors on the host side but a ton client side.
You might need to restart the client. Or remove and re add the player prefab from the network prefab list
Oh removing and readding it from the prefab list fixed it, thanks!
I think so
could be another alt
Shipwreck still has the healthy mindset about netcodes
and he got good humour too
you did report their asset store account?
I also found out DEVYLewis never actually inside Fishnet Server
but only Unity & Netick
@ripe mesa that discussion is off topic for this channel.
<@&502884371011731486> can someone review above conversation(s)? It’s starting to get a little creepy, but at the very least it’s not on the topic of multiplayer game dev.
Got it
Thanks!
We don't need to start witchhunting accounts. We are all aware of these alt accounts, we don't need to make it a big investigation.
And yes, please keep these channels specifically for Networking questions.
Can anyone help me understand the tradeoffs between have one “game session” per game server process versus having many game sessions per game server process?
I’m using “game session” to mean a game that players can connect to. I’m using “game server process” to mean literally an instance of a game server (I run mine in containers which are packed onto VMs based on expected CPU/memory/network traffic metrics expectations of my game server). One game session per game server process means the entire “purpose” of a game server is to be host to players for one round of something, like a FPV deathmatch, and then be thrown away.
My initial tradeoff summary:
one game session per game server process
Many game sessions per game server process
I feel like I’m missing more pros/cons to decide which way to go, hence why I’m reaching out. Thanks for sharing any/all thoughts. Ask if I’m not being clear about what I’m asking
I would go with whatever is easier for you to implement and iterate on focusing on making the game playable and fun, because otherwise there's a very slim chance of having more than 20 players actively playing at once. If you get it running like that and want to keep supporting the game and you see more players coming in that's when I would begin worrying about costs, performance, waiting times etc.
So many times people want to fixate on a random complexity in their games only to slow down in progress and eventually abandon the project altogheter, or miss the fun in their game so there's no one to ejoy that amazing efficiency and low-cost custom networking solution...
Many game "sessions" per a single server process only works for relatively simple games with few (less than 10) players per session.
Because most of Unity is single-threaded, and thus this won't scale beyond x number of sessions per game process.
However, there is an important advantage to it. You only have one Unity Game Engine overhead for all those game sessions. Since each Unity engine process has its own overhead, which is x amout of mem usage in addition to multiple threads, which all use your CPU time.
Running multiple Unity game processes (one session per process) would exhaust your CPU and RAM way faster than several game instances per process (with multiple of those too).
Now, when it comes to the netcode difficulty of this, it depends on which networking solutions you use. Most if not all networking solutions are not designed with this in mind, which makes it very annoying to work with.
However, Photon Fusion and Netick (my networking solution) are built with this in mind. In Netick, by default, your game instance runs in something we call a sandbox. A sandbox is an instance of the game, which can be a server or a client. And you can very easily run more than one sandbox together, in the same Unity process.
Whats an updated ngo tutorial?
Can someone thats here to learn networking and not fixated on their own networks products please provide their best ngo tutorials?
One important thing to take care of when doing multiple instances per process, is to never lag the process.
So all instances of the game should always be ready. Even going as far as having all player prefabs being spawned already, if not pooled.
Because you don't want another in-process server to cause another in-process server that already has a session running in it to lag.
Loading scenes async is good but not good enough. It still can cause a bit of lag due to GC. But in the end, it all depends on the specific game you want to build. For fast-paced games with client-side prediction, this is kinda a must for a quality game experience.
Can you share the output if a render texture across a network? Like of each player has a render texture you can see what they're seeing?
is netick a dedicated server solution?
That would use a lot of bandwidth. Way more than the game's state sync usage.
Impractical imo.
Yes.
i'm hoping to find a peer to peer networking solution that has host migration (if host disconnects, someone else takes over as host) ... security isn't a priority for my particular game (local boardgame with multiplayer)
just don't want to pay for dedicated server hosting
and people will task switch (etc) between their turns, and possibly no one will be connected at all
To be honest, for such a game, you probably want to code your own netcode for this.
Won't be that hard.
You can use a high-level transport like LiteNetLib.
i already coded something that works, but have the rest of the game programmed using the Boss Room sample as a base, and having a hard time integrating my working host migration prototype into the boss room sample ... i surgically removed the part where the lobby is shutting down, and the parts where it disconnects the clients when the host disconnects, but for some reason the lobby shuts down after a while 😦
i've spent a few days trying to figure out why the lobby seems to shutdown
Code it from scratch, so you don't have to deal with other people's bugs 😄
my prototype with host migrations works perfectly lol ... i wonder if we should just redo the project on top of that
It's a turn based game so lag isn't really an issue I mainly want other players to be able to see the current active player's UI and all the sub menus they're opening up without having to create a full system of having fake menus pop up to mimic them
Not sure what networking solution you are using
But you can use video codec and send a byte stream using your networking solution, and handle the rest etc.
Maybe you want to look for an already built solution if you don't want to get your hands dirty.
I'm using unity relay but I'll look into those
i'm using unity lobby + relay/transport, was trying to avoid game server hosting
Are you using ngo? Im trying to find updated tutorials if you have any ideas please
Thanks!
oh, i just used the Unity documentation for the most part, i don't really know the best practices for it apart from that ... my code is a gigantic mess 🤓
https://docs-multiplayer.unity3d.com/netcode/1.8.1/advanced-topics/message-system/rpc/
Any process can communicate with any other process by sending an RPC. Starting in version 1.8, the Rpc attribute encompasses Server to Client Rpcs, Client to Server Rpcs, and Client to Client Rpcs.
yes, using NGO, but just RPC calls, not stuff like networktransform, etc
If you have some money to spend, you can check out Photon Fusion Shared Mode.
It's client-auth P2P-like netcode, where the game would continue just fine when anyone disconnects.
But if you want server-auth gameplay, then probably a bad idea.
wow really? wooooow, going to look into it now thank you!
I think Im too new to start without a video. There are a lot of ngo videos but I dont know how updated they are.
maybe something like the boss room stuff? ...for me boss room was way too over complicated and added waaaay too many things that i didn't need
I will check that and if too much maybe try bobsis fishnet videos. He has a lot and theyre recent too. Thank you for reply.
BTW, video streaming is very bandwidth expensive and too overkill for this problem.
A better solution to your problem is to sync data that lets you re-create the UI of other players.
This would be several orders of magnitude cheaper in bandwidth usage.
Thanks for the responses. Good points. Fixed cost of cpu/memory per unity is a consideration. Not sure how much impact unity being single threaded would be really but obviously more players being handled by a game server process would possibly stretch per frame calculations higher and higher. As long as the game server under load can stay under the per-frame performance budget, all should be fine right?
Python is single threaded, and so is JS, and they can do fine with many concurrent requests, is pretty much my reference. In Unity I can use techniques like performing long calculations over many frames (aka coroutines), and other techniques.
You bring up what I know as “noisy neighbor” problems. You know, limited resource contention like if one container requests more CPU/MEM of its host, taking away from other containers. The interesting thing with multiple game sessions per game server process is that it adds another place for noisy neighbor that would need to be considered; other game sessions. E.g. if a malicious game client spams network packets to the game server, a poorly coded game server may allow its CPU/memory usage to increase, or if a game spawns in many game objects whose deletion causes the GC to run. Any other dimensions to sketch out on this point?
I don’t understand why the game server would need to 100% guarantee to have the right scene loaded before a player connects, or the bit(s) about sync versus sync loading. That part of your words didn’t quite make sense to me, so I’m probably not understanding something (sorry!). In my mind it’s still fine to have players all connect to a game server and only once everyone is in, to send the signal to game clients to load in the level (sync or async, just implementation details), if I wanted to. Actually right now I just have player game clients load into the desired scene and have a loading screen overlay while waiting for everyone to have joined before letting them play.
As long as the game server under load can stay under the per-frame performance budget, all should be fine right?
Yes, but that's the problem. Even a little bit of a GC stall can cause the server to miss the tick deadline, which can cause rubber-banding in the clients. I am talking about server-auth gameplay with Client-Side-Prediction. Though even for client-auth, you will see other players lagging not yours due to interpolation buffer running out when the server misses the tick deadline.
, or if a game spawns in many game objects whose deletion causes the GC to run.
This is easy to deal with. Only the server is allowed to spawn network objects. Have a cap on how many objects can exist at once, of each type, etc.
I don’t understand why the game server would need to 100% guarantee to have the right scene loaded before a player connects, or the bit(s) about sync versus sync loading.
Yea, this one depends, as I said. I was thinking of a game where you would join mid-game and straight into the action. For games where everyone needs to be ready before the game starts, then it's fine. But again, you don't want another in-process server instance that is switching scenes to cause lag to other in-process instances that are in the middle of the game. Remember, all gameplay logic runs in the main thread. Async scene switching causes GC, which can cause a stall causing the lag problem.
Though I wonder, what type of game are you intending on building?
Maybe a client-auth approach that is P2P-like is a better fit.
To then refine the calculation: a game server should stay under budget included the worst case if the GC runs. I can appreciate how considering worst case frame when GC is running puts a sizable burden on available resources with GC on other active game sessions.
To think more “out loud” object pooling allows for predictable considerations for CPU/MEM resources, in part. N instances of the game scene means N * (resource requirements per scene) (+ the overhead of starting a unity process to server as a single game server instance). That can help especially during capacity planning (or as I like to call it, stuffing that VM full of running container instances).
I suppose I now realize another difference between the two styles: many game sessions per game server means more stable container runtime; one game session per game server means more of a churn of container resources. Aka game server instance startup time is = startup of container + start up of game server process + total time until 3rd party network service provider can distribute available game sessions to players (through game clients, lol). I mean, it’s not a huge cost but still one to be considered between the two styles.
Many game sessions per game server also means considering, um, veterinarian services to running game server instances. Perhaps a neutrino hits a data center in the perfect spot to kill a server process; how I handle this case needs to be considered. Actually still true for single/single, but it feels less so since a container’s lifecycle is so limited in the many/single case.
Thanks for helping to sketch this all out.
Eventually a game session where players can enter after start, but working on a simpler version where a game session is meant to serve a more ephemeral experience.
Server-auth gameplay is a requirement?
Destiny apparently has multiple classes of game services that are either P2P run (one player is host), and others more trusted operations are handled under client/server authority.
For my games, yes. Server auth is a requirement. Server runs physics, and it has to be accurate for everybody. High reaction gameplay is not a requirement, so things being a little slower is fine.
You can also artificially increase your client's default buffer length for interpolation, for instance, to deal with potential server lags.
Then you can also use a slower tickrate, that means you can have more sessions per process, and also have more room for small CPU stalls to not cause issues.
Good point. Lol full of good stuff, thanks.
Happy to help 😄
Another parameter to be able to tweak and take measurements on. Nice.
Giving all this a good think over.
Shouldn't this set the text for this textmeshpro to the newdistance value on all the clients as well? It only sets the text on the host for some reason.
You'll need to make sure that distanceCounter is set on the clients too
Can ngo do different scenes for players? Fishnet docs say it can here https://fish-networking.gitbook.io/docs/manual/guides/scene-management/loading-scenes. I dont see anything about scenes for each player on the ngo page https://docs-multiplayer.unity3d.com/netcode/current/basics/scenemanagement/using-networkscenemanager/#loading-a-scene
Not by default. network objects need to be in the same scene in order to be synced. You can use custom scene management but it's way more complicated
Okay. Thank you.
Hey can I make a game that use hotspot to make a multiplayer game
Please share a tutorial
you are trying to act like an actual user looking for help??
you never interacted in this server ever since joining in 2021 until now to defend fishnet
not sure why the admin is not doing anything when it's crystal clear what your goal is
Using a mobile hotspot is just like a normal LAN game.
Fishnet Alt
Good morning you lovely people!
I am trying to send a smart switch signal to trigger a unity event and vise versa. Anyone got an idea where to start or what to use? I am completely lost 😵💫
UPDATE: okay so I read into UnityWebRequest and it seems to be the thing I am looking for. Issue now is that I am struggleing to find the right method as I am just calling the url without trying to get or set a different value.
I’m assuming “smart switch” means a physical IoT button; I’m also going to assume there is a service built backend for the button. If I’m right, share the make/model so perhaps I can more accurately advise. If I’m wrong, sorry!
Given we’re in networking channel, I’m also going to assume it’s for a server/client multiplayer model; you have one game server hosting a game session for players, who are playing through game clients.
To integrate a smart button into your experience, you’ll have to decide who pressed the button/toggles the switch. Is it a player, or is it some game administrator? If it’s an admin, presumably it’s to change the state of the game server. If it’s a player, you’ll just have to lay the plumbing so the client makes an RPC call onto the server so that the server knows about the physical interaction. Great.
But how does a client or server know about the physical interaction? That’s where you’ll have to figure out if the game client or server needs to ask the IoT service (aka pull), or if the IoT service can tell the client/server about the push (push). Pull or push, there are techniques to be mindful of.
To pull info, the simplest version is to poll at some regular interval (say 30 seconds) to see about a state change. Is the game client or is the game server polling the IoT service? You can provide more secrets (like API keys) for a game server since you can trust it more; if there are secret values to handle then the game clients scenario becomes more complicated.
If the IoT service supports pushing state changes, then you’ll need to set up whatever you need to in order to “catch” the update. I’ve often seen this using webhooks.
Hope this kinda clears some things up, presuming my assumption of what you’re trying to do is accurate
Unless the smart watch is running a webserver you can connect to, you'll need to look into Bluetooth LE integration
You can probably tell that I am kinda new to this sorta stuff. So sorry if my question was unclear 😅
Im gonna go a bit more into detail. Basically its a Shelly smart plug that can be triggered by calling this URL http://[IPADRESS]/relay/0?turn=toggle. What I used to test before was a Application.OpenURL but thats not really what I want since it actually opens a browser window outside the game. What I am struggling with is the fact that I only seem to find GET and POST methods for UnityWebRequest which I dont really need. I just need to call this URL for it to toggle the switch, not change any values with POST
HttpWebRequest is the way to go then.
This is wrong, don’t listen.
It is running a webserver so no need for Bluetooth
I did not know that was a thing and even when you just said this, it took me minute to find the documentation for it lol. Ill check this out ty very much :>
When the server shuts down, I load the menu scene for the clients again, but when I do, there becomes two network managers under don't destroy on load, I thought that because it's a singleton, that it would only have one instance, do I have to deal with the multiple instances, like is it initial, or should be destroying the copy of itself.
BTW I used regular scene manager since the server should have been shutdown, is it still supposed to be the network manager scene manager?
Hi, I'm making a unity (unity 6 preview) WebGL multiplayer game and I wanted to avoid servers and instead have one player act as the host. I noticed that Unity Transport doesn't support WebGL as a server but only as a client. Is there a way around this? Would Relay allow a webgl to act as a host? Or do I need to switch to using dedicated servers? Thanks for any help
Nvm, I found the answer to my own question here:
Are you using additive scenes? Maybe it’s best to have game clients restart at the menu scene if so? Or some other scene. The idea is to “hard reset” to a known state on game server disconnect.
@old mural I connect the host and clients like normal, but when the host disconnects, I send the clients back to the menu, with the scene manager load scene function, when I do the network manager just adds another network manager, since it's on don't destroy on load, but I assumed it would destroy the instance already in the scene that's present the first time, instead it just keeps two network manager objects in don't destroy on load
Network Manager gets set to Do not destroy on load. You'll need to get rid of the network manager in the main menu. So what you'll need is a bootstrap scene that loads the network manager and then immediately move to the main menu scene.
Hehe. Full disclosure: I avoid singletons (but respect all singleton action by anyone else). What @sharp axle just said is exactly what to do. I categorize that is “cleaning up singletons.” Heck, maybe even before you redirect game clients back to the menu maybe the scene that loads the network manager destroys it before redirect. I think that might be cleaner, than having your main menu clean up possible resources from other things. But whatever works!
I myself just prefer to kinda think of scenes as the unit of “thing” that maintains more complex things. If I need a game system in a scene I just pull in a prefab of that game system into the scene, and only have one of those as a creative decision. I think it’s simple but everyone has their own preferred way of making things work.
what is this
@sharp axle what is a bootstrap?
Just a completely empty scene with only your managers and/or Singletons in it. And a single script that will load the main menu in Start(). Make that the 1st scene in your game and will never have to worry about duplicates
Downside is that you always have to test from that bootstrap scene. There are some editor tricks you can pull to always load the bootstrap scene when you hit play from wherever.
can someone please help?
https://forum.unity.com/threads/netcode-for-gameobjects-multiplayer-player-sync-problem-in-moving-spaceship.1597023/
hey we're looking for a music artist for an upcomming GameJam (starting tomorrow 9 pm and lasts 10 days). We're making a industrial horror game o/
One option is to parent the player to the ship. Another to prevent sliding would be to just increase the friction on the floor of the ship
on my client network transform, when in game, interpolate gets turned on with no option to turn off. I have it unchecked. Any Ideas?
Why does it get turned back on when the game is started?
mustve been a bug. I deleted and re added. unity 6 preview has proven to be quite buggy.
Hey ! what do you recommend for a MMORPG (max 100 players online) between "Photon Fusion" and "Unity Netcode" ?
Photon fusion, UNET (Unity’s old netcode library), Mirror, or NGO (netcode for game objects, Unity’s new netcode library) all kinda have similar advise, since they’re all netcode libraries with very, very similar concepts…
Send only what is necessary; try to limit what commands/RPCs/variables need to be synced to the bare minimum. Limit the range each where a player would need to see other players (dubbed interest management in mirror).
Talking past the netcode now- since mmorpg game servers are long running processes, make sure that players joining/leaving doesn’t cause a memory leak or anything.
Tagging in @dry maple in case they have some helpful insight for MMORPGs in terms of netcode library but more importantly different game server topologies to set one up.
E.g. does only one game server maintain one persistent mmorpg world, or does it make more sense to have different game servers maintain different regions of the world, and game clients are passed between game servers when traversing between regions? That’s kinda the curiosity I have of like how people actually set up an mmorpg solution…
For now, i really want do most simple , so one server for now but maybe later , we will add more
It really depends on what you mean by MMO. Fortnite can handle 100 players. and Valhiem is a persistent world. Neither I would call an MMO
That’s a good approach.
Between those two libraries, I’d actually choose photon fusion since that netcode library should be more battle tested since it’s been around for longer. Unity’s NGO is still new and I don’t really trust Unity after the disastrous UNET fiasco.
That said, I default to Mirror. I’ve read the docs for NGO and photon fusion. YMMV
i'm inspired by a old MMORPG (Ryzom), its a classic mmo with a persistent world
I don’t think the details of the game mechanics or a debate on what constitutes a (genre) substantially changes the nature of the advise.
I try Photon Fusion for now, its free for >=100 player online
Nice. GL. Hope you come back with questions/commentary.
using UnityEngine;
using UnityEngine.SceneManagement;
using Fusion;
private NetworkRunner _runner;
async void StartGame(GameMode mode)
{
// Create the Fusion runner and let it know that we will be providing user input
_runner = gameObject.AddComponent<NetworkRunner>();
_runner.ProvideInput = true;
// Create the NetworkSceneInfo from the current scene
var scene = SceneRef.FromIndex(SceneManager.GetActiveScene().buildIndex);
var sceneInfo = new NetworkSceneInfo();
if (scene.IsValid) {
sceneInfo.AddSceneRef(scene, LoadSceneMode.Additive);
}
// Start or join (depends on gamemode) a session with a specific name
await _runner.StartGame(new StartGameArgs()
{
GameMode = mode,
SessionName = "TestRoom",
Scene = scene,
SceneManager = gameObject.AddComponent<NetworkSceneManagerDefault>()
});
}
private void OnGUI()
{
if (_runner == null)
{
if (GUI.Button(new Rect(0,0,200,40), "Host"))
{
StartGame(GameMode.Host);
}
if (GUI.Button(new Rect(0,40,200,40), "Join"))
{
StartGame(GameMode.Client);
}
}
}
public class BasicSpawner : MonoBehaviour, INetworkRunnerCallbacks
{
public void OnPlayerJoined(NetworkRunner runner, PlayerRef player) { }
public void OnPlayerLeft(NetworkRunner runner, PlayerRef player) { }
public void OnInput(NetworkRunner runner, NetworkInput input) { }
public void OnInputMissing(NetworkRunner runner, PlayerRef player, NetworkInput input) { }
public void OnShutdown(NetworkRunner runner, ShutdownReason shutdownReason) { }
public void OnConnectedToServer(NetworkRunner runner) { }
public void OnDisconnectedFromServer(NetworkRunner runner, NetDisconnectReason reason) { }
public void OnConnectRequest(NetworkRunner runner, NetworkRunnerCallbackArgs.ConnectRequest request, byte[] token) { }
public void OnConnectFailed(NetworkRunner runner, NetAddress remoteAddress, NetConnectFailedReason reason) { }
public void OnUserSimulationMessage(NetworkRunner runner, SimulationMessagePtr message) { }
public void OnSessionListUpdated(NetworkRunner runner, List<SessionInfo> sessionList) { }
public void OnCustomAuthenticationResponse(NetworkRunner runner, Dictionary<string, object> data) { }
public void OnHostMigration(NetworkRunner runner, HostMigrationToken hostMigrationToken) { }
public void OnSceneLoadDone(NetworkRunner runner) { }
public void OnSceneLoadStart(NetworkRunner runner) { }
public void OnObjectExitAOI(NetworkRunner runner, NetworkObject obj, PlayerRef player){ }
public void OnObjectEnterAOI(NetworkRunner runner, NetworkObject obj, PlayerRef player){ }
public void OnReliableDataReceived(NetworkRunner runner, PlayerRef player, ReliableKey key, ArraySegment<byte> data){ }
public void OnReliableDataProgress(NetworkRunner runner, PlayerRef player, ReliableKey key, float progress){ }
}
I have this error :
Assets\BasicSpawner.cs(30,1): error CS0106: The modifier 'private' is not valid for this item
Someone know why ?
Photon has their own server that might be more helpful.
this chart is written by the fishnet developer named punfish(firstgeargames) who is banned in this server for creating fake accounts
probably this chart is filled with fake information as that's what punfish is known for
i suggest to use either one of these:
Unity NGO,
MIRROR
or
PHOTON FUSION
i use photon fusion, and consider it to be the best, and there are benchmarks show that
who are you
I would say that Photon probably has the biggest userbase. It can get pricy but there are tons of resources which is good and bad. There is lot of outdated tutorials out there for all of these frameworks. I'm biased towards Unity's NGO. But you can check the pinned message here for more resources
Ive seen a lot of praise for Fishnet and have seen mirror isnt as popular. I was in the mirror server for awhile and I agree it wasnt active.
dude, the punfish is banned in the mirror server
in this server
please leave me alone
and others
because of fake accounts
you probably saw the fake accounts praising it
lol
there are no games successful games in the fishnet netcode
@sharp axlesince you use unitys program have you tried Fishnet?
I haven't. Most of their good features are locked behind a paywall
what do you think of the fake accounts?
I don't think of them at all. They aren't worth the effort
I saw on the chart a few were paid but im not sure I need those features. It says the price is only a few dollars anyway if I really did. I know thats not free free like I said but thats cheap enough to consider imo
DUDE, the chart is biased
it is written by the banned fishnet developer
im feeling you are bias
bias for what??
its always aggressive ones that are the problem
your language looks very similar to the fake accounts we banned
I wouldn't put too much stock in that chart either. But nothing stopping you from trying it out for a little while. You're not getting married to it
i think we might need to call the mods
I wasnt just the chart. I did read a lot as well. thats how I found the chart. but you have my curiosity about what is wrong on the chart?
everything is wrong, it's written by a person who makes fake accounts
how can you trust someone like that

how do you message mods
<@&502884371011731486> @blissful jay has been harassing me since I joined and I asked them to stop
to talk about fishnet
this is punish(firstgeargams) alt
social engineering, playing the victim
you are trying to git rid of me using another alt account because i am exposing you,
hopefully the mods are smart to understand that, since they know about your ways
I checked the Fishnet server, this account is in there and he has no msgs in there EVER.
im going to take a break and hope youre gone when I get back
Yea go with photon or mirror. Mirror is a really active community and it’s open source. Probably your best bet IMO. Otherwise if you have money to burn go with photon or if you want to stay with Unity, NGO.
@ruby glen
Ive seen a lot of praise for Fishnet and have seen mirror isnt as popular. I was in the mirror server for awhile and I agree it wasnt active.
Removing your chart.
Don't spread misinformation here, thanks.
Mirror server is quite active and has daily updates log.
im not sure what you mean. mirror did not seem as active as other servers im in. to me the community is not that active that is how I perceive it. why is the chart not allowed? if something was wrong with it wouldnt it be removed off the forums? thats where I found it
i have noticed that there are a couple of users in the fishnet server who try to talk each day in there to make it look more "Active"
the punfish is known to pay people from poor countries to do random things for him
like here
@ruby glen who cares. What kind of game are you trying to make? I'm here mostly to help come up with solutions to multiplayer game software problems.
he also probably pay people like this account to spam this server
sometimes i have seen that the fake accounts use weak language
is this even the unity discord?
Can you both stop bickering. This channel is for asking and answering questions. We don't need to debates.
it is clear what his goal is, why not just ban him?
I didnt even start anything and i asked shipwreck many times to leave me alone.
zzz
I'm not going to dig into it. And you've been told before not to drag this drama here.
and this was the first rule I saw when coming in. funny
• Engaging in harassment, abuse, discrimination, name-calling, or other personal attacks.
i am trying to help mod against punfish, i understand his ways
im thinking something 2d. everyone makes 3d sound a lot harder
sorry if it's annoying
As I said before, we're aware the developer of the asset has alt accounts, but we're not going to investigate every claim.
Your first reply to their reasonable message was to ask them who they were, which is a massive red flag. Move on
move on from what?
what did i even do?
nevermind forget it
i dont know what half those things mean so i will trust you on it being cool.
I'm experimenting with building a hazelight studios-like split screen multiplayer game just for fun. How do you guys think i should handle the cameras?
Give each player prefab a camera and try to log it in a list and modify the rect of each of them - What I'm currently trying to do, to no avail atm. I'm using cinemachine and one camera just standby's when i try to get both on the same screen
Try to create a dummy (local) camera and sync it to the other player's position, this looks doable. But how would i get the second player's UI then? or the inputs on screen
You are trying to do split screen multiplayer over the network? Or couch co op with online support? I don't know hazelight studios
first one! hazelight studios are the creators of it takes two, a way out, brothers
a story game meant for two players in coop split screen over the network
hazelight studios made one of the best games of all time
It Takes Two
- Set Up Split-Screen
To create a split-screen effect, you can use Unity’s camera rect property to define what portion of the screen each camera should render:
Assign Camera Rectangles: Select the first camera and set its Rect property (in the Camera component) to (0, 0, 0.5, 1) for the left half of the screen. For the second camera, set it to (0.5, 0, 0.5, 1) for the right half.
I haven't made split screen multiplayer before. I do see there is a "viewport rect" that takes in coordinates between 0 and 1.
I think the idea is to have two main cameras, one on the top half and the bottom half. Then I'm assuming two cinemachine cameras, each assigned to a different main camera.
I'm going to try this out myself.
Oh i did this locally already, i even created an handy way to have each rect be resizable in game
i just can't get it to work over the network
locally i tried with the input system manager's join system
Gotcha. Yea. Each player prefab would have their own camera with a client Network Transform to keep them in sync
You wouldn't use the input system for this unless using local multiplayer
I'll show you how far i got if you don't mind
I kinda have this setup already, it's just that the client camera keeps "taking control" of both
You'll need to make sure that only the local player camera is accepting inputs
Sorry about being slow...
What does it mean to want to do "split screen" over the network? Is there two game clients for the two players, each that renders out it's own split screen? E.g. player 2 is on the bottom of the screen and on game client for player 2, they control that... But they see everything player 1 is doing on the top of their screen?
yep!
and it kinda mixes and matches together too. like if player 1 is going through an important moment his screen takes more screen space than the other one
Oh, that's really cool. Okay, I get it now. What @sharp axle is saying is on point
You'll need to make sure that only the local player camera is accepting inputs
For the non-player... sync the transform of the other player's camera.
okay, it makes sense. And what about the UI? how would i show each player's UI to each other?
For resizing the camera... Send a command/RPC to resize the viewport bonds.
And what about the UI? how would i show each player's UI to each other?
More Commands/RPC is my default response. Which netcode library are you using? Photon fusion? Unity UNET? Mirror? Unity NGO?
this is where i got, as you can see i get two cameras but they are either both on one player or both on the other. this is the code for this contraption:
private void OnClientConnection(NetworkManager manager, ConnectionEventData data)
{
if (data.EventType == 0)
{
if (networkManager.IsHost) {
playerCameras.Add(networkManager.ConnectedClientsList[(int)data.ClientId].PlayerObject.GetComponentInChildren<Camera>());
}
}
}
void Update()
{
secondScreenWidth = 1f - cameraBalance;
if (networkManager.IsServer) {
DoSplitScreen();
}
}
void DoSplitScreen()
{
if (playerCameras.Count < 2) return;
Debug.Log("Split screen should be working.");
playerCameras[0].rect = new Rect
{
xMin = 0f,
yMin = 0f,
xMax = cameraBalance,
yMax = 1f
};
playerCameras[1].rect = new Rect
{
xMin = cameraBalance,
yMin = 0f,
xMax = 1f,
yMax = 1f
};
}
oops my bad
NGO btw
You would use Network Variables to keep the UI in sync. I would have a UI manager that has references to both players' UIs
for sure my dude 💯
wut
👋 Hi
Please stop pushing this further. This is the last time I'm going to bring this up before people start getting muted.
hlapi beef is crazy
I undestand, I dont start a debate. just making sure people are not being fooled by alts
And I'm telling you to stop dredging it up so it doesn't become a debate every time. Move on, block them if they're bothering you. Thanks.
I'm building a two player co-op game. Does it make sense to build it with server authoritativity in mind? I'm not worried about cheating at all, but i've heard about some desync issues. I don't really get what would get "desynced", so it's a bit hard to imagine, but i'm guessing i could build most of the game giving the authority to the client and give it to the server where needed. Just don't really know where i'd use it (?)
it depends, since you dont care about cheating then you can just have the clients send their position to the server (client authoritative movement) but if the player does something like for example firing a gun, you'll want to calculate the trajectory of the bullet on the server, then send the results to the clients so that everything is synced
that makes total sense. thank you! so basically physics simulations?
basically the server should simulate evrything related to the game state and send it to the clients so everything is synced
Anyone have recomendations for a networking solution? I'm not sure which to choose between fishnet, fusion, mirror, or netcode. If it helps, my game idea is a fast paced fps with 2-8 players.
Fusion. If check out its description it’s the only one that matches your game.
hey yall , im trying to use [ClientCallBack] but it isnt working (i am using unityEngine.Networking) was it changed because i cant find a changelog
Fishnet
fusion
fusion has made br200, a highly competitive shooter
while we dont have anything battle tested for fishnet
!code
Use links to services like:
https://gdl.space/, https://paste.ofcode.org/, https://hatebin.com/, https://paste.myst.rs/, https://hastebin.com/
Surround code with three backquotes. Not quotation marks.
To format as C#, add cs to the first line:
```cs
// Your code here
```
Add a comment with a line number if there is an error message.
Room list is not called, does anyone know why?
https://gdl.space/dicevokica.cpp
Does anyone know how one might implement a server/client visualization (“what the server sees” vs “what the client sees”) for hithoxes like in this video @ 2m35s?
I imagine it’d have something to do with timestamps. E.g. player shoots and the timestamp of their interaction is sent to the server, and the coordinates/other state for the red “what the server sees” hitbox is sent back to the client where the client can position both red and blue character hitboxes.
VALORANT’s technical director, Dave Heironymus, and technical engineering lead, David Straily, know the pain of bad servers getting in the way of landing clean shots. Here’s what we’re doing to keep VALORANT’s netcode and server infrastructure sharp so that you’re in control of each engagement.
Learn more at:
https://PlayVALORANT.com
Follow ...
lag compensation?
Debugging visualization aids?
You basically need client prediction setup for this. I guess a workaround would be to save the last few frames of client positions and have the "server" view be the client position minus your half your ping time.
does anyone have any good resoureces to learn how to do steam multiplayer? I want to learn basic p2p where player one hosts the lobby, then additional players can join in the lobby and play whatever mission is happening. Im also down to learn it in a non-steam related way if its better or easier
Why would I need client side prediction to visualize what was shown in the video?
What that video is showing is client prediction.
well server prediction in their case. normally the client is running ahead of the server
You'll need to use a Relay Service for this. You can use Steam P2P, Unity Relay, Playfab, or Photon. How you do this kind of depends on which networking framework you are going to use. Unity Netcode, Mirror, and Photon are the main choices, but you can use others.
Yea it’s displaying what the server saw at that timestamp where the player’s interaction occurred. That’s not client side prediction.
what would you recommend for ease of use? there doesnt need to be matchmaking just join your friends lobby and play ect ect. also any great youtube tutorials woiuld be great
I think my proposed technique of having the server sending back state data about an avatar at a timestamp probably gets me where I want to be.
E.g. player A shoots at player B. Copy the current state data of player B at that time and render a visualization. When the server sends back what it saw at a timestamp, render a visualization for that too.
I use Unity Netcode, But Photon and the other are just as good and have been around a bit longer. If you go with Unity NGO, then I recommend Code Monkey's course on it
https://www.youtube.com/watch?v=3yuBOB3VrCk&ab_channel=CodeMonkey this? is this p2p that will be compatible with steam freinds list joining down the line?
❤ Watch my FREE Complete Multiplayer Course https://www.youtube.com/watch?v=7glCsF9fv3s
🌍 Get my Complete Courses! ✅ https://unitycodemonkey.com/courses
👇 Click on Show More
🎮 Get my Steam Games https://unitycodemonkey.com/gamebundle
Quantum Console https://assetstore.unity.com/packages/tools/utilities/quantum-console-211046?aid=1101l96nj&pubre...
i need the players to not need to port forward or anything like that
just join eachother and have networking handled
Yea. there is a newer 6hr course as well. And it is compatible with Steamworks. But you will need to get the basics down first
oh where can I find this 6hr tutorial? and by basics what do you mean, where could I learn them? thanks for help
💬 Here is the Multiplayer Course! I really hope both of these FREE courses help you in your game dev journey! Hit the Like button!
🌍 Course Website with Downloadable Project Files, FAQ https://cmonkey.co/freemultiplayercourse
🎮 Play the game on Steam! https://cmonkey.co/kitchenchaosmultiplayer
❤ IF you can afford it you can get the paid ad-free ...
cheers legend
Room list is not called, does anyone know why?
https://gdl.space/dicevokica.cpp
You need to have a history buffer to store past positions/rotations of each player. (I wrote a short article of how to implement lag-comp hit detection in Unity Multiplayer Server if you are interested in that).
Then you can append each client's input with the snapshots ticks that it was seeing at the time of the shooting in addition to the alpha, to recreate the view of the client later in the server.
But, this actually won't work with the default Unity animator, it won't be accurate enough. Because we can't control precisely how the animation is played in it.
So you must implement your own animation system using the Playable API to have perfect tick-accurate animations.
Then all you have to do to be able to make a visualization like that is to make a copy of the skeleton of the character with only the Hitboxes/Colliders, and draw them using Gizmos.DrawCube/DrawSphere.
You make a copy of the current state of the character (present time in the server).
And also a copy of the lag-comp state of the character (client past time).
Yea share the article?
It’s interesting that you talk about the animator. Presumably I can see what frame of what animation was being played on the client and the server, but I’m guessing it’s not that simple. I’ve done a couple things with the playables API for sequences before, so I have some experience.
You can't control the precise point in time of the animation, it's a must have to be able to perfectly recreate the animation using only the timing info.
Gotcha gotcha.
Room list is not called, does anyone know why?
https://gdl.space/dicevokica.cpp
Are you talking about the “OnRoomListUpdate” function? Looks like it’s something that the “MonoBehaviourPunCallbacks” superclass calls. You might have to read through the superclass code to understand why it isn’t getting called
Yes is this function, and what is superclass?
The superclass is the class that you based your own “CreateAndJoinRooms” class on. It basically says “I want all the code included in the superclass plus what I write myself.”
Long story short: open up the MonoBehaviourPunCallbacks class and look for when it executes the “OnRoomListUpdate” function. That’ll may give you a better idea when it gets called.
Yes, if you want physical interactions between players (for example), you want a central server.
You want each input from each client to be aligned to a specific point in time in the server, for correct prediction. This is not possible with client-auth networking.
If you don't care about physical interactions between players, then you might not need that.
oh okay that makes it clearer, thanks. But I can always have just the physical simulations on server side and have things like the movement system client auth so that it feels snappy for everyone right?
I am not sure what you mean.
Is your player movement not part of the physical simulations?
I'm using a character controller
I see.
So what do you mean by physical simulations?
What type of game are you thinking of.
example if one player throws a ball
i can and should just do that server side right?
No, it would be delayed that way. If that's fine then you can do that.
i see. then what other way i have of syncing the physical motion of the ball? i was thinking server auth + some basic prediction
It depends on the game.
If the ball movement behavior is fully predictable and deterministic, then you can just directly move it in the client and the server will most likely do the same.
i was thinking server auth + some basic prediction
Yes, that's the optimal way for when you want a physics-rich networked game.
It would be helpful to know what type of game/genre are you making.
If it's an FPS, and you just want to throw a grenade, you can do that client-sided and it will be fine.
Sorry for not specifing. It's a 2 player coop split screen game over the network
kind of like hazelight studios games
Like It Takes Two? Hmm.
yes! so clearly there is gonna be some physics involved but it's kind of secondary
I don't remember that game having sophisticated physical interactions between players? Usually it was just platforms, right?
I played it locally on split-screen, don't know how it behaves over the network.
But I would use CSP with a game like that, for sure. Just in case one of the minigames need accurate interactions.
no, nothing fancy or crucial
Okay got it. I will see if client side auth movement will feel bad and add server auth with csp later I think
Which networking solution are you using?
It's not really as simple as adding it later.
One of the coop players will act as a host/server, so you should just do it server-auth from the start.
ngo. why anyway? isn't it enough to edit the player movement script?
Ah, no lol.
There are people who have been trying to perfect their CSP systems for years and still have issues with it.
It's not a simple thing.
You probably want to use a solution built with CSP in mind, like Photon Fusion, or Netick (my free networking solution).
oh no i know. i just wanted to know if it's a decentralized system (meaning ill have to build it for each script i want to use it for) or a "global setting"
ohh it's you? you did popup in one of my google searches yesterday
Oh nice 😄
idk about switching api. i was using fishnet for another project and had the worst experience cause there were near to zero tutorials at the time. ngo is very similar but I'm having a better time already
Don't switch if you don't feel like it.
Fishnet over complicates CSP, their implementation is not great.
In Photon Fusion and Netick, it's like writing single-player code.
You just add NetworkRigidbody to your character, and use AddForce, and you are done. Mostly.
is root motion supported? idk if it's even a thing in multiplayer tho tbh
No, you don't want that at all since you want to move the player using code not animation data.
gotcha. well I'll think about it!
Good luck.
How would i go about synchronizing a list of cameras in ngo? i need my client to parse through all the connected players' cameras and to do so i tried having the server do the logic and then sending an rpc with the parsed cameras to the clients, but that doesn't work since Cameras are not serializable in ngo
for me I made the cameras a part of the player prefabs and I run this code in the player script:
public override void OnNetworkSpawn()
{
if (IsLocalPlayer)
{
GetComponentInChildren<Camera>().enabled = true;
}
else
{
var cameras = GetComponentsInChildren<Camera>();
foreach (var cam in cameras)
{
cam.enabled = false;
}
}
}
i don't think this would get you to see every client's cam like i need to
(as the client)
why do you need every client's cam?
I'm building a split screen networked game. I'll have a max of two clients with one host, and i need to have a reference of each cam
gotcha
i got it server side, just not client side
well while Cameras are not serializable in ngo,you can pass a networkobjectreference, here's how to pass an object:
[ServerRpc(RequireOwnership = false)]
public void SendObjectServerRpc(NetworkObjectReference objectreference)
{
SendObjectClientRpc(objectreference);
}
[ClientRpc]
public void SendObjectClientRpc(NetworkObjectReference objectreference)
{
if (objectreference.TryGet(out NetworkObject object))
{
//here you can do whatever you want with the object for example
object.getcomponent<camera>().bla bla bla
}
}
you can do that, or have the same list of all cameras locally, and have the code for them run only on the target computer, that's how you do almost anything. All networkPrefabs as well as all networkBehaviour objects will be replicated across clients, so you would need to store the same list of "local" cameras and act on them as needed, only verifying who runs the code under what condition
I always like to imagine the world being identical on both clients initially, and you picking who knows about which changes, so other players' positions etc. Anything else will, by default, stay the same if not explicitly changed
I would do that. I just can't, cause to parse through each player i need to use NetworkManager.ConnectedClientsList and that is only passable through the server in ngo 1.9.1
can't get how to update to 2.0.0 where it's not like this anymore
gotcha, I didn't dig too much into direct netwrokObject id values, but if they're identical across clinets (I would assume so, otherwise how would they keep track of anything lol), you can pass around those as strings. So send an id, and look for it on the target client. Ideally, if you do it often, or want more security, map those camera components to those id
id's directly, and you'll get O(1) time of getting them by ID, so basically like if you did it locally
networkobjects id huh
i didnt even know that was a thing
it should be, not sure how accessible it is for outside scripts, but there should be this id field for each networkObject component, the one you have to put at the root of an object for networkbehaviors under it to work
I would be surprised if that wasn't the solution under the hood at least, because you can't rely on the scene hierarchy or names to replicate any change reliably
yup, here you go, they mention serializing networkobject references as well as globalobjecthashId here: https://docs-multiplayer.unity3d.com/netcode/current/basics/networkobject/
A NetworkObject is a GameObject with a NetworkObject component and at least one NetworkBehaviour component, which enables the GameObject to respond to and interact with netcode. NetworkObjects are session-mode agnostic and used in both client-server and distributed authority contexts.
that should do it for you then
You will need to upgrade to Unity 6 in order to use NGO 2.0
thanks! imma try and refactor my code and update you
is that a thing? i just downloaded the last lts version
okay, kinda got there, now my only problem is that if a client joins later he won't see the objectId of the clients that were spawned before
idk if i should try having a network variable or just loop through each client everytime one spawns
If you are on NGO 1.9.1, you can do a NetworkVariable<Dictionary<clientid,Camera>> and have the server/host add to it whenever a client joins.
yup, that sounds reasonable, you can expand it later to not contain the camera component reference directly, but some intermediate script responsible for more things if needed as well
this is when you get to the points of, oh so i need to update a value on all clients when it changes, and that's exactly what a netwrokVariable does for you, with some nice configuration options you can add to it, like reading and writing permissions.
Not sure if you can serialize the camera component directly in a networkvariable like that though, sounds like going full circle on the issue, no?
Ah, you're right.
If you were to explain what do you need that for im sure we can skip the serializing of components directly anyway, sounds like a design flaw
you most likely want to just tell the correct client to do something with their camera
but might be wrong, so go ahead
not really, as i stated i'm trying to build a 2 player split screen networked game. Never done anything like this before, but to have the split screen happen i have a split screen manager that should take in both client's cameras and then set them to their respective sizes. Got this to work on the host side, not on client side
oh so the issue occurs when the 2nd client joins, and the 1st client has to know about the newly spawned camera to adjust it via the manager?
the issue occurs when the second client ( so not the host) joins and has no idea of the other player's camera
cause i parse that into a list at the spawn of the respective client
i'm trying most of all to learn the mindset of networking coding
Use the Player Object's OnNetworkSpawn() to add its camera to the split screen manager
oh alright, so no need to do anything via the network then, you can have network onclientconnected callback on it, or let the camera manager (singleton probably, right?) know "hey, i spawned, here's the camera component ref" locally on the onnetworkspawn
i can't send cameras as overloads iirc
wait you lost me
no, just send it to the local split screen manager
yeah, you don't need to send anything via the network, once a player joins it's playerprefab is spawned across all clients, you can let the local screen manager know you spawned and pass the camera as an argument, have the manager remember the reference then
as of right now i have (in my splitScreenManager) this code
private void OnClientConnection(NetworkManager manager, ConnectionEventData data)
{
if (data.EventType == 0)
{
if (networkManager.IsHost) {
playerCameras.Add(networkManager.ConnectedClientsList[(int)data.ClientId].PlayerObject.GetComponentInChildren<Camera>());
}
}
}
``` should i change approach completely?
this looks kinda devious not gonna lie
Yea. you don't need that at all. You should be doing that in OnNetworkSpawn() from the player prefab
you just overshot with the complexity a bit i think that's all, you send information across the network only if its neccessary, that here is not one of those
Follow what otaku here says, the OnNetworkSpawn() will run across all clients once an object is fully instantiated from a prefab and "ready for action", that's when you let anyone that needs to know you're here
so i'll just use each client's onNetworkSpawn and have them send their cameras/objs to a local splitscreenmanager that handles stuff separately
Now you will need to Find the reference to playerCameras if its not a Singleton. The player object will have no idea what that is when it spawns
yes sir, cameras is something you pretty much always handle locally, unless you do some cutscene or need all player cameras to look at something at once, otherwise all local code. I guess cutscenes and similar can also be handled locally with a simple RPC with some custom cutscene or action ID, much less overhead anyway
You could also fire off an event that the playerCameras can listen for. If you're feeling fancy
so like this i'll get to the point where playerCameras holds both cameras in a list hopefully
yeah i figured. just this whole split screen thing messing with my head
yeah I get it. Especially if you wanna go down the mixed-authority route, I have a dumb issue now where putting a few extra non-network classes and singletons at once into my code completely broke clients connecting to each-other and the server. Fun times.... fun times
I try to avoid Singletons like the plague. Especially in Networking
I guess you shouldn't jump the shark and always use VCS, I now basically take baby steps to see when it all went down the shithole
agreed, doubled-edged sword
so what do you use to reference external scripts? custom events?
Lately, I've been using static Events. But I'm not above just slapping in a FindGameObjectByType()
serialize references, and enforce some top-down hierarchy, but Singletons are king when it comes to just getting things going
talking about singletons, can i use networkvariables with them? cause i'm trying and it doesn't look like it works. maybe that's the problem?
You can. But I wouldn't. It needs to be on a network object and those get respawned when the scene loads. You just need to be extra careful that your static Instance is set correctly.
gotcha. thanks a ton, i'll just use them as a placeholder and then use events
Sorry for the constant pings. This'll be the last one.
I made my cameraBalance float attribute a networkvariable, it's a public variable so i tried changing it in the inspector and it doesn't look like it syncs with the client. Am I using it wrong?
The onValueChanged event doesn't look to fire either,
public class splitScreenManager : NetworkBehaviour
{
public static splitScreenManager instance { get; private set; }
public NetworkVariable<float> cameraBalance = new NetworkVariable<float>(0.5f);
public override void OnNetworkSpawn()
{
base.OnNetworkSpawn();
cameraBalance.OnValueChanged += cameraBalanceChanger;
}
//here i just tried copy pasting what i had in update to see if it worked but nothing, not even the Debug.Log fires
private void cameraBalanceChanger(float previousValue, float newValue)
{
if (playerCameras.Count < 2) return;
Debug.Log("Split screen should be working.");
playerCameras[0].rect = new Rect
{
xMin = 0f,
yMin = 0f,
xMax = Mathf.Lerp(previousValue, newValue, 0.2f),
yMax = 1f
};
playerCameras[1].rect = new Rect
{
xMin = Mathf.Lerp(previousValue, newValue, 0.2f),
yMin = 0f,
xMax = 1f,
yMax = 1f
};
}
Where is playerCameras getting set here?
i just copied the code necessary to give you context. playercameras gets his cameras from a script on the player, like we said. When the code snippet that is in cameraBalanceChanger was in Update, it worked perfectly both on client and server, so i don't think it's that
OnValueChange does not get fired on first spawn. you can call cameraBalanceChanger() directly in OnNetworkSpawn() if you need to.
Put the Debug Log in front of the if just to make use it's actually getting run
sure, i'll try. shouldn't i see the networkvalue change in the inspector too tho?
nop. not firing not even when i call it in OnNetworkSpawn()
Is splitScreenManager getting spawned at all?
yep. as i said when i had the logic in update it was kind of working
lemme try and remove the instance manager for the singleton
nothing
tried switching from onnetworkspawn() to OnClientSpawn and now it fires at least at the start, it's still not registering change of values tho
tried switching from onnetworkspawn() to
!code
Use links to services like:
https://gdl.space/, https://paste.ofcode.org/, https://hatebin.com/, https://paste.myst.rs/, https://hastebin.com/
Surround code with three backquotes. Not quotation marks.
To format as C#, add cs to the first line:
```cs
// Your code here
```
Add a comment with a line number if there is an error message.
Why the function OnRoomListUpdate is not called?
https://gdl.space/edapozugox.cpp
Hey, does anyone here know how to do correctly BackfillTickets update on dedicated server when players leave and join the server?
Everything is working fine on my server except this backfillticket update.
backfillticket approval is called in coroutine once per second and creation is done on server start.
Here is image with error so if anyone can help it would be really nice.
how does things like pun sync for example objects and variables in scripts across clients. like how do the know what objects are the same between clients and what script it should put the variable in?
networkIdentity/networkObject
or PhotonView
Backfill ticket
Not enough information to say.
Can somebody tell me why nothing happens when the client with the id 1 presses on that game object?
I am only starting with Netcode maybe I have a wrong idea how all that stuff works
The function is simply not called for some reason
OwnerClientID will be the owner of that object. If it is an in scene network object then that will always be the server client id 0
thanks, do you now how to fix it? I found the problem already, but I dont now how to fix it
The easiest way is to use the new [RPC] so you don't even need duplicate functions
https://docs-multiplayer.unity3d.com/netcode/current/advanced-topics/message-system/rpc/
Any process can communicate with any other process by sending a remote procedure call (RPC). As of Netcode for GameObjects version 1.8.0, the Rpc attribute encompasses server to client RPCs, client to server RPCs, and client to client RPCs. The Rpc attribute is session-mode agnostic and can be used in both client-server and distributed authority...
thanks
OMG THANKS I got it working
Im lost
how could I fix this
im unable to insert my player prefab into my network manager
sounds like the prefab list scriptable object might be missing or somehow corrupted
go to the fishnet developer discord server, he's not here because he's banned here so you won't get good help asking questions about it here
I did
they told me to upgrade fishnet
if you want my advise, use a networking solution with little to no bugs like NGO or Fusion
@old mural you had a perfect reply, why did you delete it my man
I don’t like responding to fishy accounts.
i think this guy is legit
saw him spaming the fishnet server too
Eh. I’m honestly suspicious of anyone talking about that netcode lib. I’m not a fan of the possibility of this type of guerrilla marketing because it feels manipulative. I’d rather steer clear.
💯
I've tried to upgrade my fishnet and it resulted in more exceptions. Now i get :
Assets\FishNet\Runtime\Generated\Component\Utility\DefaultScene.cs(39,26): error CS0104: 'Scene' is an ambiguous reference between 'FishNet.Utility.SceneAttribute' and 'GameKit.Dependencies.Utilities.Types.SceneAttribute'
im a bit confused by how I can eliminate this problem
you don't
you switch to NGO, MIRROR or Fusion
the firstgeargames deliberately adds bugs/breaking changes so you keep sponsoring and paying him for support
Yea it’s probably best to go with something more battle tested. Go with Unity’s netcode for game objects (NGO), or the different flavors of UNET aka Mirror or photon fusion.
so do you think I should just scrap fishnet and move on completely
You got this.
You could either remove fishnet or remove GameKit. Or you use the full name of the Scene attribute that you want to use there
I tried removing gamekit and that only resulted in more exceptions
is fishnet really that bad?
yes, it's also maintained by a dishonest and deceptive individual who's a master of fraudulent marketing (making fake accounts that spam different servers to promote his shovelware)
we recommend avoiding using fishnet, and instead use a more battle-tested system like NGO, mirror, or fusion.
it's not
NGO, mirror or fusion
Fusion 100%
why
it's way way better than anything else out there
because it's coded by a team of 50 veteran netcode programmers
used in games played by millions of gamers around the globe
it's not free, that's the only problem with it
I see
But, if you calculate the cost, it's only 1% of your game revenue
steam already steals 30%
or the different flavors of UNET aka Mirror or photon fusion.
this is wrong
Fusion has nothing to do with UNET, the api is VERY DIFFERENT.
I think you meant PUN, that is no longer supported by the photon team.
None of them are all that different from each other. Just various flavors for the same concepts of RPCs and Network Variables
Wrong
RPCs are not even used in most Fusion games
also UNET didn't invent RPCs
it's a concept from webdev
Pls give fusion a try, i think you never tried it
you will be delighted
I have not. too expensive for my blood
lol
it's not
the photon calculates that in average they only take less than 1% of your game revenue
if you publish in steam
steam takes 30%
for nothing other than hosting your game
Really? I thought photon fusion was based on Unity’s UNET. Am I wrong? Did they rewrite the netcode library after essentially forming UNET?
i don't understand
Fusion is original
Mirror was the continuation of UNET
ahhh
if you mean mirror
yes
Negative; photon fusion. This is the talk where the photon devs say they forked UNET: https://m.youtube.com/watch?v=Y1my5bKhKJY
This talk discusses the important trade offs in developing multiplayer games, such as server vs client authority, local determinism vs state serialisation, rollbacks, and other known and proven mechanisms.
For more information on Unite Europe and future Unite events visit this page. https://unite.unity.com/
Christof Wegmann - Exit Games
fusion was created in 2020/2019
LOL
they probs are talking about PUN
the classic photon solution which is no longer supported
Yea you’re probably right. Still, if it was a fork of UNET but then they rewrote it, it’s still at least inspired by UNET. No?
no
it's not rewritten
it's a whole new netcode lib
called Photon Fusion
your information needs an upgrade, lol
Word, I’ll take this under advisement. I’ll investigate a little more.
i mean the whole point of fusion is that it's a modern netcode you can't get anywhere else
so of course it's not inspired by unet
@old mural
the punfish/fishnet dev was bothering fholm (the inventor of fusion) everyday to teach him how to write client-side prediction
you can find all that stuff in the mirror watercooler channel
This is bolt iirc
No one cares about it, but I think many people will end up in the same spot as me... I found the culprit after at least 3h wasted... The issue went away once I enabled a PlayerInteractor script... a Monobehavior script attached to the PlayerPrefab
Disabling it again after connecting successfully at least once did not cause the issue to occur again... this is mindblowing, these inconsistent errors without clear explanations were the reason I was about to give up within the next 10 minutes. Make sure your networkPrefabs list is correct and play around with your player prefab components/scripts and just pray it fixes the issue
Nah, I've used PUN before. I was already using NGO/MLAPI by the Fusion came out
you were on the fusion discord a while ago, but it seems I couldnt find it..
I'm in the photon discord but I don't think I've actually posted there
huh...
Im 100% sure you were trying to build games from photon, and I see a lot of post of it, its like on 2022
Dunno. Definitely wasn't me though.
damn.. I'm tripping.
What do you think about fishnet?
Just scroll up a few pages. The developer at least is not held in high regards. I can't speak to the quality of the product itself
bro is going to make us discuss the same thing again
yeah scroll up I guess, and try to search the word with "fish", there are alot of information there
The author of Fishnet is sussy
But what about Fishnet itself?
decent
there are alot of better netcode over it
also the license
on fishnet is sussy
Such as Photon Fusion?
you are trying to build fps game right?
Wdym
Yep
NGO is not currently suitable for that
they uses a custom license, which changed alot over time.
Fusion is still top tier for shooters.
90% Big Studios use Fusion
pretty much 2023 to 2024, unity, large-scale multiplayer in steam uses either fusion or quantum
I see, that's quite impressive
It's true that there are no big games made with Fishnet
Or I'm not aware of them
indeed, most of the games is not succeed enough
But is that a problem of the game itself or its networking solution? Hard to tell
a lot of things to consider
Was this your benchmark test ?
yep, iam
fishnet: custom license -> sus
fusion: made by exitGames trusted for decades
mirror: true open source -> zero cost
another consideration is, It's feature, which feature you need and you dont need.
newbies goes for fishnet because they fall over the marketing trick
fishnet "Evolved Networking Solution", how convincing it is?
however, professionals tend to research whats the catch using this solution
and ended up using fusion instead
I will reconsider this
its up to you.
I also got my programming job thanks to fusion
huge demand, compared to fnet
Fusion > Quantum > Mirror
That is from my research for game programming jobs market availability
I was researching for a while but it's difficult
Hello, someone know how to make websocket with Unity WebGL builds ?
I tried a lot of differents things but none of them can connect to a local TCP server with TLS
The official Unity transport called Unity Transport has a built-in driver for WebSocket.
I've tried it and it works pretty well.
The problem is that i have a pretty big code base for my server written in raw TCP in C#, i just want something to be able to connect to the server like another tcp client would do
I think it's important to abstract the low-level networking aspect of your system, so you can plug-in/out another transport layer easily.
At this point in time, you have coupled too much logic with the socket layer, making a lot of things difficult for you.
You would either have to make your own custom Transport or just use a C# TCPClient to connect. If its a web server then you can use UnityWebRequest
@trvlonesurvivr fps game 2
FNet License
I cannot able to Host on Webgl.
I used wss in RelayServerData but it gave error as Invalid Connection type, use dtls or UDP.
I use Unity Lobby, Relay and NGO together
Is Unity Transport 2.2.1 can be used for production build?
If yes then why the update is not available in package manager since a year.
depends on your unity version
Am using latest 2022.3
it seems, its the lates then
then it should mean its stable?
It seems stable, just wondering why the package manager didn't had it's update since v1.4.1
update = could be a new feature
It's just the way packages are whitelisted in the editor. You can install Unity Transport 2.0 by name in the package manager. Just specify the version
Any advice on what “multiplayer infrastructure services” (not 100% sure on terminology) is the easiest to integrate with and supports a local development story (more later)? Note: not netcode library, I already have a netcode library I like a lot.
I’m using gamelift but I think I’m finally ready to accept that it doesn’t have a good local development story. I can run my game server process inside of Unity editor, but it takes 1-4 minutes before it actually shows up in GameLift as available for players. This feature is “gamelift anywhere.” Anyways, I used up a lot of time realizing the time delay is a thing. Given I want to iterate on my netcode and see changes frequently when I’m in the flow, whatever system I integrate with needs to immediately show state changes when I’m running my game server inside Unity editor.
Yes there are workarounds but I’d work on my project instead of coming up with clever workarounds to gamelift.
this depends on your game matchmaking
is it csgo/valorant/overwatch style (on-demand) ? or MMO (persistence-server)
multiplayer infrastructure services
the better term is, game server hosting infra
You can normally just run the server locally. But if you need your changed deploy to your server hosting quickly then you'll need some kind of CI/CD solution.
I’m not 100% sure how I’ll handle matchmaking. A player will be able to make a room, and have a room for others to join. Ideally it’s something that I can use for different matchmaking setups.
ok, what type of game it is?
Yes I’m running my game server locally in my Unity editor. The idea is to integrate with a 3rd party service to get game server information to game clients.
No I don’t need a CI/CD process for local development.
Yes I need whatever 3rd party to “see” the game server process immediately after whatever game server setup ritual is complete. That’s all I need to iterate quickly.
thats a traditional matchmaking then, join by ip?
Not only IP, but host name and port depending on transport
For local dev it’s obviously localhost. My transport defaults to 7777 but is configurable via CLI.
Workarounds I’ve already implemented: (1) add a button to connect directly, skipping 3rd party integration (2) add an API endpoint who game clients interact with instead of the service directly, and allow the endpoint to echo back overridden host name and port, skipping the 3rd party integration.
I don't know of any matchmaking service that will hook into your locally running server. You could bypass matchmaking for your test server and just have players connect directly to its IP
They all do, I bet. Both the game client and game server are running locally (remember, the focus here is on the local development story). When I’m registering my game server process via gamelift I say the IP and port is just localhost, and it happily is able to interact with the process.
Im hella confused what do you needs tbh
Thanks for the honesty. I’ll try again…
What I want: I want support local development by running my game server in my Unity editor. I want whatever 3rd party service to “see” my game server process immediately after registering it.
I want my game client build (also running locally) to query the matchmaking service, and for the matchmaking to return the host/port of my local game server, so it can then use the info to connect to my game server running inside my Unity editor
Gamelift already supports this behavior, it just takes 1-4 minutes before gamelift “sees” my game server to be able to respond to the game client query.
In reality, when I click my workaround button to connect directly to localhost on my game client, it can connect. It’s just gamelift as the 3rd party matchmaking service takes forever to see it.
Instead of coming up with a workaround, I’d rather integrate with a service that’s faster.
Unity Lobby would be enough I guess? @sharp axle
I dunno how gamelift does it. But I would just have a Test Server button on the clients that will connect directly to the IP of you locally running server
That would require the least amount of changing your code
@ripe mesa @sharp axle wait, so when you are making a brand new multiplayer project how do you guys develop it locally? I mean after you guys install your netcode library, configure it, and essentially are able to have a blank game client build and a blank game server? Assuming you’re going to integrate with a 3rd party service for matchmaking.
Just direct connection, and kick the integration work until the game is 100% complete?
yeah...?
Really…? If you don’t understand the Q I can elaborate
you dont want the extra bloats or extra process to slow down your CORE multiplayer game development, such as cloud, authentication.
using photon here and the lobby system there doesn't have any of the delay it sounds like you're experiencing, so this hasn't been an issue for us
If its dedicated server I just run locally. I'll use Unity Lobby/Relay for remote play tests
I want support local development by running my game server in my Unity editor. I want whatever 3rd party service to “see” my game server process immediately after registering it.
I reprhased this as, "I want to start server in my game editor and I want my game server to be exposed to the internet, so clients can browse it"
No, not exposed to the internet. The game server and game client are both running on the same machine, so connecting the game client to localhost:7777 is valid. I just need the matchmaking service to be able to return that info immediately.
you want your server to be listed somewhere, so the client can browse it
is it?
Basically!
thats unity lobby
or you can use EOS which is 100% free but more difficult to integrate
Yea. have the server start a lobby and the clients can search for it
add the connection info to the lobby data and anyone who joins the lobby can connect
or photon realtime could works, but it will use its relay I think which is a minus point sometimes
or, create your own using REST API
@sharp axle I’m hoping to understand more about your flow. Talk to me about how you handle your UI during the initial local development period…
For my game client, I present the main menu. I have “create a room” and “join a room” buttons. The user isn’t expected to type in host name or port information; that’s handled in code.
So how do you handle the case of connecting directly
I use Unity Relay to avoid port forwarding nonsense
you usually want a relay for the real game anyway, so i've always preferred not to add special direct connect method for development if possible
just in case it behaves differently!
Effectively what I’ve done. The game client code doesn’t change at all in this case, which I like a lot
Unity Lobby has a QuickJoin function. where it will automatically find and join the first available lobby. The server is the only lobby
@old mural hasnt said anything about using dedicated server or client-hosted
Client/server model, not P2P. Though that doesn’t really change anything for my local development story, except the detail that my game server is a host instead of just a server.
dedicated or not?
Dedicated
then lobby is all you need
Cool. Thanks all for patience and effort understanding my questions/context.
I’ll try to integrate with some of Unity’s matchmaking features and then photons’. Hopefully they play well even though I’m not using either’s respective netcode library!
Just for clarity. Unity Matchmaking service requires a dedicated server build to be uploaded. It will not work with a locally running server. That is different from Unity Lobby/Relay. Those can be run locally.
Omg hahaha. Bros…
I’m actually now extremely curious how other game devs approach developing a multiplayer game locally.
I try to follow the id software “just make the finished software” approach so I don’t like making a special case for local dev in my game server code or game client code. But I still want to iterate quickly and frequently.
Packaging up and uploading my game server to production takes too much time when I want to test something.
Sounds like @sharp axle you just make an exception for local dev, pushing off integration for later.
When it comes to testing server hosting/matchmaking, then you deploy to your development environment
Actually, never mind forget it. I feel like I’m eating crazy pills for wanting what I’m describing, which is weird because in all other types of software development this is exactly how it works.
I think I’m just unreasonable in the game dev world for wanting to see stuff working locally without hacks before I promote up to other environments.
Unfortunately there is no way to test Unity Services locally or offline. Azure Playfab as a docker container you can to test somethings locally. Other services might have other ways
Again, the 3rd party service doesn’t have to run locally. When I’m writing a go API server that interacts with Stripe APIs, I don’t need Stripe to be running locally too in order to develop me RESTful contracts locally, if you understand my meaning.
it seems you are overseeing stuffs
?? What do you mean?
Is this a guess that I’m not actually the game dev but instead a nontechnical person overseeing other technical people? Or a typo…?
what I meant is, you are expecting overkilled stuff that should be simple
I see. I will admit I can be particular about things; the crux of my “issue” is that I don’t want to make local dev an exception case in either my game client code or game server code. But I also came up with workarounds I described earlier to keep development moving along.
I’m only asking because I’m curious if anyone else understands and has advice.
no worries
Hello all you uber networking people 🙂 I have a question. Im working on an mmorpg, yes I know mmorpg's are not for single developers but I am. I have set up the player, a world, some mobs with ai, animations, a city, some flying stuff etc. Now the question is, I want to implement a SERVER / CLIENT based system so the main server will hold the brunt of the game and the clients will connect to the SERVER gameworld. Should I scratch the project and start over using networking from the very get go or is it not too hard to convert everything to networking, ALSO, do I need to use Entities (never done networking before) or should I use some other solution such as mirror or netcode for objects? I enticipate around 300 to 500 CCU's per server. It's a science fiction game in line with Everquest hehe. Thank you for any pointers, advice.
not an answer, VRising is made using entities netcode but modified I think.
The battle-tested MMO right now is Mirror, but its bandwidth usage it high...
Getting much more than 100 players on a server is going to be tough no matter which framework you choose. Ditch the Massive ambitions and work towards a more manageable couple dozen players first.
You will end up rewriting a bunch of code if you are starting from a single player game.
@sharp axle yes that is my thought exactly. I will work towards say 10 to 20 players but my concern is, if I get more players is there a way to re-right the networking for more players or not hehe. Never really worked in game networking only some minor mobile and desktop projects.
There are always optimizations that you can do but it depends on the type of game and how much latency you can put up with or hide in some way. There are tricks to hide the number players clients can interact with and unloading empty parts of the world to keep server resources down.
@sharp axle Yes been reading about that. I was planning on loading only the parts of the world that is used or has players on it. I was looking at Mirror as Entities is more for very advanced coders but was worried that in the future if I get more players Mirror might not be able to handle the packets whereas Entities is supported by Unity made by Unity and should work more smoothly I guess but having spent now close to a month learning Entities, man it is not easy to implement. Browsed over Mirror and it looks very user friendly for people like me hehe
Also Netcode for entities doesnt look like it can handle graphics that well but Unity 6 I think is more suited for it.
Only use Netcode for Entities if you game is already built for DOTS. The learning curve is too high. There is nothing technically stopping you from using Netcode for GameObjects for this either. Its just more work to implement some kind of Area of Interest management system. Photon Fusion has this built in as well.
That’s more of if you’re using an ECS implementation, right? ECS as in a similar architecture that overwatch uses
Not just any ECS, NFE goes all in on the entire DOTS tech stack. It makes heavy use of Jobs and Burst as well as the new Unity Physics.
Anyone have experience pairing together Relay + UTP + Mirror? Running in to a deadend problem and looking for some help..
UTP?
Unity Transport Package
This sample should still work
https://docs.unity.com/ugs/manual/relay/manual/mirror
That's the sample I'm using.
Basically my problem is I can host, allow client connections and play a full game no problem the first time through
But after stopping the server
going back to a main menu scene
and trying to do this again
I'm always getting random errors that are almost impossible to trace. Usually something to do with Relay or the samples Transport.
It's leading me to believe there's something in the sample's code that isn't being cleared from memory that is messing with by subsequent games and their connection.
Because if I shut down the application/stop play mode and restart it, the first game works perfectly fine again.
Its probably duplicate network managers when you go back to the main menu
I remove the NetworkManager from DontDestroyOnLoad when the game scene is loaded. So it gets destroyed when going back to the main menu.
I've also tried destroying it manually to ensure this is not the case.
I suppose the transport itself could not be shutting down properly for whatever reason. But its hard to say without seeing the error messages
Basically the only error message I get, and things sometimes still don't work even if this doesn't fire.
Looks like it's not starting back up properly
Guys who easier to make online game unreal or unity?
lol, I think you'll get a biased answer here
I hope get the best answer
Not sure what I did because it was working perfectly before, but when testing creating and joining Unity relays on two separate devices (my desktop PC and my laptop), the client is disconnecting immediately. But when I use ParrelSync on my Desktop, the connection sustains. I have a pretty complex lobby/relay setup but I even created a very basic script that does the bare minimum of simply creating a relay for the host and joining it with the client, and the client is still disconnecting immediately. I've tried turning on and off Connection Approval in the Network Manager inspector and no change.
I did notice however that if I put a debug log in my approval check method, it fires it when the host creates the relay, but not when the client joins.
It should be firing when a client joins, because when connecting with ParrelSync, which sustains the connection correctly, this debug log fires when the client joins.
Are there any obvious things I might be overlooking? I can share my basic relay script if needed.
Also, my unity transport is pretty much default settings besides changing the protocol to relay.
5 years ago, the answer would be Unreal.
But now there are new solutions for Unity that are better than anything in Unreal in terms of everything that matters:
It's an outdated idea that Unreal is better for multiplayer games. Maybe when you restrict it to official built-in solutions, then yes that's true, Unreal default networking is better than NGO.
Ty for your time
tldr, when using unity relay my client is disconnecting immediately after joining when using my desktop pc and laptop to test. but using ParrelSync on the same device it does not disconnect.
And those solutions are? I'm just curious
Photon Fusion, Photon Quantum, and Netick (my own networking solution).
And how about Mirror and Fishnet? (Both free)
Netick is the only free option among those three right?
Outdated libraries using the old UNET API.
The solutions I mentioned are all built with unmanaged, data-oriented design, with a modern API.
Outdated? I thought they are still getting updated regularly
The internal design and workflow is outdated.
For that to change, they must be re-written.
Okay, I understand
https://en.wikipedia.org/wiki/Data-oriented_design
Modern computers are pretty fast when you design your code to take advantage of things like CPU cache.
Solutions that internally use classes everywhere are not cache-efficient. Which can be a problem as you have more objects and more players.
In computing, data-oriented design is a program optimization approach motivated by efficient usage of the CPU cache, often used in video game development. The approach is to focus on the data layout, separating and sorting fields according to when they are needed, and to think about transformations of data. Proponents include Mike Acton, Scott M...
For reference, DOTS is data oriented design taken to the extreme
Yes, so Netcode for Entities is data-oriented too.
anyone who helps me fix the issue, i'll pay back by making some kind of nice stylized art asset for you 🙂 (i'm an artist, check out my Twitter or YouTube linked to my Discord profile)
All you can really do is check the console for errors. I don't have enough info the make many suggestions
no errors
that's what's making it so difficult to debug lol
the main logs i'm getting as the client are
-[Netcode] Connected
-[Netcode] Disconnected Event From 0
-[Netcode] Shutdown
-[Netcode] ShutdownInternal
-[Netcode] NetworkConnectionManager.Shutdown() -> IsListening && NetworkTransport != null -> NetworkTransport.Shutdown()
I almost wanna say its like a firewall issue because it works perfectly when using ParrelSync, but isn't Lobby supposed to be firewall friendly? I disabled my firewalls to try an attempt and it still didnt work. So I dont think its firewall related
Relay should get around most firewalls but VPN and some ISPs can cause issues
let me double check i have no VPNs on
I wanna say i tried both without a vpn and with one to see if there was a difference and got nothing
what platform is this for?
what do you mean?
Android, iOS, Windows?
windows
Hey guys. I wrote some network code for my my air hockey game. The client always runs the server/host code when instantiated. How do I fix this?
Ok. And when you test on your laptop are you using the editor to do so?
Yes, i've tried editor and an actual build and both have the same result of the client disconnecting immediately
Let me try that now. Can i just run the exe twice? i've actually never done that before
Yep! You can open as many as you want. That's why I asked about platform
Best to use that for most of your testing anyway. It recreates the most realistic environment in comparison to editor testing with Parrel Sync.
Your isServer check there will always run for every player on the server/host
If you are signing in anonymously then you will need to make sure that you are switching profiles if you are running both on the same machine
Alright, so I tried 2 actual builds side by side on my desktop and they worked. But when I try 2 builds on my laptop, it doesnt work lol. So the outlier is definitely my laptop
Definintely odd.
is it a big scene? Lots to load in, lots of NetworkObjects, lots of initialization?
And there's no errors if you try to connect your laptop editor as a client?
just the warning/info logs about Connection -> Disconnect -> Shutdown?
Yeah, it's only the warning/info logs. no errors at all
You can try turning off the firewall on the laptop in windows. really shouldn't matter though
Just for editor with Parrel Sync. Two .exes won't have this issue.
i did that and even disabled my entire anti virus lol, still nothing
I'm gonna try to get a friend to test it out on his pc with mine in a bit
hopefully it's just my laptop acting weird
will keep everyone updated lol
when in doubt turn it off and back on again
I restarted both systems a few times at this point but still nothing
I wouldn't necessarily hope for this haha. If your laptop is having client connection issues, that could mean a bunch of other devices fall in the same boat
true
I've tried using isHost but it still runs on the client as well
I even tried isServer
Should not be possible at all. Can you show what functions are calling this code?
There is something very wrong if IsHost/IsServer is true on the clients as well
Oh, it's just the public void onnetworkspawn
Do us a favor and put Debug.Log(IsServer); in Start() and tell us what it prints out for the client
cause this isn't adding up lol
OnNetworkSpawn() gets called on all clients as well as the server. That might be causing the confusion
are there any resources on unnamed messages other than the unity docs?
Not really. What more information are you looking for?
I guess the only other resource would be the source code itself in the package or on github
does anyone have a suggestion for a good solution to stream a unity camera between two devices over a local network ? we looked at unity render streaming but the problem is it needs an external signaling server, which we cannot have in our local environment...
I think WebRTC is what you want
https://docs.unity3d.com/Packages/com.unity.webrtc@3.0/manual/videostreaming.html
I thought webrtc was relying on a signalling server as well?
It works just as expected. Client says false and host says true
I did try moving the code to separate functions and calling them on start and now it works 😁
But now I realize that client is not allowing me to move the player paddle. It has a simple click to drag function that works on the host.
Just be careful of doing network related calls in Start. Most of the time it’s fine but most libraries will provide you with custom functions like OnStartClient() that run on the start of a player’s joining to a server.
By default, movement has to be done on the server. So you either need to send clampedMousePos to the server so the server can call rb.MovePosition and actually move the player. Or you can configure your player object with a component that allows for clients to dictate their own movement and sync it to the server.
I haven’t used Netcode for GameObjects in quite a while but I believe it’s called ClientNetworkTransform
You’re going to want one or you’re going to run in to syncing, lag and bandwidth issues galore.
Yh I used clientNetworktransform on the 2022 version but on Unity 6 I couldn't find it. Although there is an anticipatedNetworkTransform
You have to create a client network transform. Its not built in
https://docs-multiplayer.unity3d.com/netcode/current/components/networktransform/#owner-authoritative-mode
Introduction
You don’t have to create it. It’s a sample script that works out of box.
That's what I mean by creating one. You don't have to get it from github. just copy the code in the docs
Okay got it!
Why would you copy the code when you can download it from Package Manager?
fewer steps? it doesn't really matter either way
I actually don't mind, really
https://docs-multiplayer.unity3d.com/netcode/current/learn/distributed-authority-quick-start/
Hello, I'm planning to use Netcode for GameObjects with a distributed authority archtecture and I found this quick start which is great.
Is it possible to when offline run something similar to unity multiplayer services locally? I want my app to support both online and local network modes
At the moment, its using a Distributed Authority Service to track authority states. I'm not actually sure what will happen when if used off the internet
probably will not connect
it will fail to connect to unity services
that's why I'm wondering if that's some way to install the service locally idk
There is not
I can techically develop my own transport for that, right? Not that it's too simple but it should be possible
not for distributed authority, I don't think. Its still using the regular Unity Transport. But I'm not really clear on how Sessions get managed there.
Yeah, I'd like to have a deeper understanding of how it works
I was just googling and it looks like the distributed authority feature is quite new and is still in experimental state, guess I'll not have precise information so soon
Yea. its super new. and very experimental. Its also using the new Multiplayer Services SDK.
I have been used to photon PUN for so long and I've always used distributed authority in my VR applications
I guess I'll have to migrate from PUN to fusion instead of netcode
I hate that they started to require Industries Circle membership ($500) for industrial projects
I tried fishnet (which looks great) but it only supports client/server archtecture
there are still various netcodes for shared authority
can you suggest some?
but they are unpopular
I guess it's not viable then