Episode 2 :
Objectif :
Rappel de la roadmap pensée fin épisode 1
itération 2 : Réseau PHOTON avec deux joueurs qui se tirent dessus
itération 3 : Réseau PHOTON avec quatre joueurs (2 par char - 1 chauffeur - 1 canonier)
itération 4 : Ajout de la mitrailleuse + PHOTON avec 6 joueurs (3 par char - 1 chauffeur - 1 canonier- 1 mitrailleur)
itération 5 : Ajout de la vie + Dégâts suivant arme (canon, mitrailleuse)
Itération 2 : - Réseau Photon avec deux joueurs qui se tirent dessus
Sur le papier : Facile ! Photo tu clic&drop et cela marche.
En pratique : Pas du tout userfriendly, pas compris...
J'y passe 1h et pas de résultats concluants...
Je décide d'aller voir ailleurs (d'autres packages) et je tombe sur Network Lobby. Ca a l'air simple, prometteur et rapidement installable.
Lien :
https://assetstore.unity.com/packages/e ... obby-41836
J'y passe dessus 1h et j'arrive assez facilement à mettre mes tanks en multijoueur (1 joueur = 1 tank) en local (localhost)
L'asset est simple, bien foutu et rapidement déployable. Il faut juste adapter ses scripts (et leurs emplacements) pour qu'ils (les scripts) deviennent network ^^
Par envie d'historiser/versionner je duplique et nommes mes scripts en les terminant par NET
DeplacementChar
Net.Cs
Code : Tout sélectionner
using UnityEngine;
[color=#FF0000][b]using UnityEngine.Networking;[/b][/color]
using System.Collections;
public class DeplacementCharNet : [b][color=#FF0000]NetworkBehaviour[/color][/b]
{
public float moveSpeed = 10f;
public float turnSpeed = 50f;
void Update ()
{
[color=#FF0000][b]if (isLocalPlayer)
{[/b][/color]
if(Input.GetKey(KeyCode.UpArrow))
transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
if(Input.GetKey(KeyCode.DownArrow))
transform.Translate(-Vector3.forward * moveSpeed * Time.deltaTime);
if(Input.GetKey(KeyCode.LeftArrow))
transform.Rotate(Vector3.up, -turnSpeed * Time.deltaTime);
if(Input.GetKey(KeyCode.RightArrow))
[color=#FF0000][b] transform.Rotate(Vector3.up, turnSpeed * Time.deltaTime);
}[/b][/color]
}
}
En rouge et gras les différences avec le script solo. En détail :
- Il faut ajouter la lib :
using UnityEngine.Networking;
- remplacer monobehavior par
NetworkBehaviour
- ajouter la condition
if (isLocalPlayer) { pour que les actions ne soient "affectées" qu'au client local
Bref une fois généré le projet on peut le lancer 2 fois et faire se rejoindre les 2 instances pour avoir 2 players.
Sur le GO du Tank il faut ajouter des composants
Network identity (en cochant LOCAL PLAYER AUTHORITY)
Network transform (pour que le joueur envoie sa position à l'autre joueur)
Network transform child (pour que les GO enfants puissent eux aussi envoyer leur position à l'autre joueur)
Pour que cela fonctionne bien il faut mettre tous les scripts sur le GO parent (le plus haut)
Résultat : Ca marche en LOCALHOST (en local donc), cela ne marche pas en ip direct.
Bizarre je vais donc voir si c'est ma configuration pc ou si c'est le projet qui a un souci...Après différents tests je décide d'aller voir d'autres packages et je trouve / on me conseille :
Master Server Framework
https://assetstore.unity.com/packages/t ... work-71391
DarkRift Networking 2
https://assetstore.unity.com/packages/t ... ng-2-95309
Mais aucuns n'est si évident à utiliser.
Je décide de continuer mon réseau "à la main" dans un premier temps (vu que cela marche en local)
Je modifie la roadmap en ce sens :
itération 2 : Réseau avec deux joueurs qui se tirent dessus - OK FAIT
Temps rech des solutions : 5h
Temps dev "à la main" : 1h
itération 3 : Réseau avec deux joueurs qui choisissent un spawn (parmis 4 sur la map)
itération 4 : Amélioration des contrôles pour avoir un vrai rôle de canonier (rotation tourelle, élévation canon, tir)
itération 5 : Amélioration des contrôles pour avoir un vrai rôle de chauffeur (direction + tir fumigène)
Je vous mets le zip du projet comme d'hab sur le drive et je vous c/c ci-après tous les scripts
DeplacementCharNet
Code : Tout sélectionner
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
public class DeplacementCharNet : NetworkBehaviour
{
public float moveSpeed = 10f;
public float turnSpeed = 50f;
void Update ()
{
if (isLocalPlayer)
{
if(Input.GetKey(KeyCode.UpArrow))
transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
if(Input.GetKey(KeyCode.DownArrow))
transform.Translate(-Vector3.forward * moveSpeed * Time.deltaTime);
if(Input.GetKey(KeyCode.LeftArrow))
transform.Rotate(Vector3.up, -turnSpeed * Time.deltaTime);
if(Input.GetKey(KeyCode.RightArrow))
transform.Rotate(Vector3.up, turnSpeed * Time.deltaTime);
}
}
}
RotationTourelleNetChar
Vous remarquerez que j'ai posé un gameobject en public pour faire référence au GO enfant
Code : Tout sélectionner
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
public class RotationTourelleNetChar : NetworkBehaviour
{
public float moveSpeed = 10f;
public float turnSpeed = 50f;
public GameObject Tourelle;
void Update ()
{
if (isLocalPlayer)
{
if(Input.GetKey(KeyCode.PageDown))
Tourelle.transform.Rotate(Vector3.up, -turnSpeed * Time.deltaTime);
if (Input.GetKey (KeyCode.PageUp))
Tourelle.transform.Rotate(Vector3.up, turnSpeed * Time.deltaTime);
}
}
}
ShootNet
Code : Tout sélectionner
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
public class ShootNet : NetworkBehaviour {
public Rigidbody projectile;
public Transform Spawnpoint;
// Use this for initialization
void Start ()
{
}
// Update is called once per frame
void Update ()
{
if (isLocalPlayer)
{
if (Input.GetMouseButton (0))
{
Rigidbody clone;
clone = (Rigidbody)Instantiate (projectile, Spawnpoint.position, projectile.rotation);
clone.velocity = Spawnpoint.TransformDirection (Vector3.forward * 20);
}
}
}
}
On verra après.
A+ et merci de vos critiques / commentaires
Stef