[WIP] - GOT#VR

Modérateur : Administrateurs Suppléants

Avatar de l’utilisateur
E3DStef
Administrateur
Administrateur
Messages : 1395
Inscription : 14 Juil 2013 18:30

[WIP] - GOT#VR

Message par E3DStef » 09 Oct 2018 21:03

Bonsoir à tous,

Suite à un bon délire avec certains membres (pour ne pas les citer) j'ai décidé de vous faire un petit WIP sur GOT#VR pour

Image
Source image : https://www.cgtrader.com/items/148139/download-page Sherman 3D Free

Titre : Game of Tank VR
Slogan : En équipe grimpez dans votre char et ... survivez !
Pitch : Un char c'est 4 place, chaque membre ayant son rôle à jouer. Le travail d'équipe est indispensable pour réussir à survivre dans votre blindé.

Je posterai ici pas à pas le WIP que je vais réaliser avec une équipe d'étudiants d'une école d'ingénieurs (ceux là mm qui nous ont développé la fonction + ou - sur le fofo d'ailleurs).

Je vous propose donc un POC (Proof Of Concept / Prototype) où je recherche l'efficacité et la vitesse de développement plutôt que l'optimisation ou la programmation avancé. J'espère qu'à travers ce WIP certains membres puiseront des idées ou des soluces à leurs problèmes.

Je mettrai pour chaque opération le temps que cela m'a pris sachant que je fais tout à la volée (pas d'algo papier avant, pas de rech d'optim). Je vais procéder comme un dev débutant, c'est à dire en allant chercher l'info plutôt que de puiser dans mes catalogues/biblio de sources/exemples. J'espère ainsi que ce WIP vous sera utile, moi je le vois comme un projet fun à partager avec vous :coeur:

Bon allez go !


Edit : Pour les curieux ci dessous lien GOOGLE DRIVE du PROJET (MAJ 09/10/2018 - 22h10)
https://drive.google.com/open?id=1jCoBB ... COdVs-IdXt
J'ai intégré le char Sherman dans la scène et appliqué ses textures et les scripts
Le Savoir n'est Précieux que s'il est Partagé

Si besoin urgent de me contacter, faites moi un mail sur : franceunity3d@gmail.com

Avatar de l’utilisateur
E3DStef
Administrateur
Administrateur
Messages : 1395
Inscription : 14 Juil 2013 18:30

Re: [WIP] - GOT#VR

Message par E3DStef » 09 Oct 2018 21:20

Episode 1 :

Objectif :
  1. Créer un "char"
  2. Déplacer le char
  3. Faire tourner la tourelle
  4. Faire tirer le canon
1 - Créer le char + Tourelle + Canon + Terrain

Facile je pars sur des formes simples et des couleurs basiques :

J'ajoute 1 cube, je le duplique pour en avoir un 2e
Je modifie le scale du 1er pour en faire la base du char - Je le nomme "Char" d'ailleurs
Je déplace vers le haut et je modifie le scale du 2e pour faire la tourelle - Je le nomme "Tourelle"
J'ajoute un autre cube pour faire le canon - Je le nomme ... "Canon" :mrgreen:
Pour fini j'ajoute une plane pour le terrain que je scale à 10

Je créé 4 matériaux : Black, Green, Jaune, Red

J'associe les matériaux aux objets pour différencier les éléments (et puis c'est joli toutes ces couleurs ::d )

Résultat en image :

Image

Bon j'ai mon char passons maintenant à son déplacement

2 - Déplacement


Je fais une recherche sur Google "unity c# script transform" pour trouver un script c# Unity pour déplacer...
Cela me renvoi sur ce lien https://unity3d.com/fr/learn/tutorials/ ... and-rotate

En bon dev fainéant je copie-colle le script dans mon projet (script que je nomme originalement DeplacementChar)

Voici le script à déposer sur le cube "Char"

DeplacementChar.Cs

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class DeplacementChar: MonoBehaviour
{
    public float moveSpeed = 10f;
    public float turnSpeed = 50f;
    
    
    void Update ()
    {
        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);
    }
}
3 - Faire tourner la tourelle


Toujours en bon gros dev fainéant je duplique mon code DeplacementChar.cs que je renomme en RotationTourelle.cs
Je supprime les conditions de translate pour ne garder que les rotate

Voici le script à déposer sur le cube "Tourelle"

RotationTourelle.Cs

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class RotationTourelle : MonoBehaviour
{
	public float moveSpeed = 10f;
	public float turnSpeed = 50f;


	void Update ()
	{
		if(Input.GetKey(KeyCode.PageDown))
			transform.Rotate(Vector3.up, -turnSpeed * Time.deltaTime);

		if(Input.GetKey(KeyCode.PageUp))
			transform.Rotate(Vector3.up, turnSpeed * Time.deltaTime);
	}
}
Ca y est mon char roule !!! La tourelle tourne...

Bon faut tirer maintenant :-)

4 - Faire tirer le canon


Google helllpp me : "unity c# script shoot"
Cela me renvoi sur ce lien https://www.studica.com/blog/how-to-cre ... e-in-unity

C'est tout moche (en anglais) mais je comprends qu'il me faut créer un lieu de spawn pour mes projectiles et créer un préfab de projectile.

Spawnpoint = GameObject empty juste devant le canon (et fils du canon bien évidemment)
Prefab = J'ajoute une sphère à qui je donne une couleur (material) et un nom original "Obus". Une fois ceci fait je descend l'object dans mon panneau PROJECT et magie = prefab

Une fois ceci fait je copie-colle le script que je nomme Shoot.cs

Shoot.cs

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class Shoot : MonoBehaviour {
	
	public Rigidbody projectile;
	public Transform Spawnpoint;

	// Use this for initialization
	void Start () 
	{

	}

	// Update is called once per frame
	void Update () 
	{
		if(Input.GetMouseButton(0))
			{
			Rigidbody clone;
			clone = (Rigidbody)Instantiate(projectile, Spawnpoint.position, projectile.rotation);

			clone.velocity = Spawnpoint.TransformDirection (Vector3.forward*20);
			}
	}

}
Et voilà, mon char tourne, avance, la tourelle tourne, le canon tire... D'ailleurs quand je tire mon char bascule ? Ah oui faut modifier les rigibody pour "fixer" un peu tout cela plus """""réaliste''''

Je note un correctif à faire plus tard : Quand je recule en tournant il faut penser à inverser la rotation

Ci dessous Screen du projet :

Image


Bon toussa m'a pris 1/2h (en gros vu que les gosses m'ont interrompu à plusieurs reprises lol), la rédaction du WIP bcp plus (mdr...)


RoadMap

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 + Réseau 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)

On verra après.

A+ et merci de vos critiques / commentaires

Stef
Le Savoir n'est Précieux que s'il est Partagé

Si besoin urgent de me contacter, faites moi un mail sur : franceunity3d@gmail.com

Avatar de l’utilisateur
axel
Messages : 1848
Inscription : 26 Avr 2012 09:10
Localisation : Lille - Dunkerque
Contact :

Re: [WIP] - GOT#VR

Message par axel » 10 Oct 2018 09:48

le translate c'est bien gentil, ça va vite à faire, mais je pense que tu vas vite te retrouver bloquer à devoir gérer tous les cas particuliers qui vont pointer le bout de leur nez au fur et à mesure de l'avancement de ton jeu. Genre devoir inverser la rotation quand tu recules...

Il existe le wheelcollider et toute la physique pour gérer des véhicule dans Unity, je pense que ça serait plus approprié.

Avatar de l’utilisateur
Liven
Messages : 189
Inscription : 30 Nov 2017 01:48

Re: [WIP] - GOT#VR

Message par Liven » 10 Oct 2018 10:59

axel a écrit :
10 Oct 2018 09:48
le translate c'est bien gentil, ça va vite à faire, mais je pense que tu vas vite te retrouver bloquer à devoir gérer tous les cas particuliers qui vont pointer le bout de leur nez au fur et à mesure de l'avancement de ton jeu. Genre devoir inverser la rotation quand tu recules...

Il existe le wheelcollider et toute la physique pour gérer des véhicule dans Unity, je pense que ça serait plus approprié.

Je peux me tromper, mais j'ai toujours entendu dire que dans la pratique les wheelcollider n'était pas opti / assez buggué et qu'il valait mieux les éviter lorsque l'on pouvait.
Après je ne l'ai ai jamais utilisé donc je ne fait que reporter ce que j'ai entendu, mais comme je viens de voir passer quelqu'un qui vient de lâcher les wheelcollider au profit des sphere car ça bugguais (http://www.unity3d-france.com/unity/php ... 2&start=30), cela a tendance à me conforter dans mon opinion.

Cela dit je te rejoint assez sur le fait d'utiliser la physics à la place des transform car pour avoir déjà "simuler" des mouvement smooth en transform, c'est quand même du bouleau (sans parler de ce qui est collisions)

Sinon sympa comme initiative :)

Avatar de l’utilisateur
axel
Messages : 1848
Inscription : 26 Avr 2012 09:10
Localisation : Lille - Dunkerque
Contact :

Re: [WIP] - GOT#VR

Message par axel » 10 Oct 2018 11:36

je n'y ai pas touché depuis longtemps aussi, mais justement il me semblait que toute cette physique avait été revue avec Unity 5.

Avatar de l’utilisateur
E3DStef
Administrateur
Administrateur
Messages : 1395
Inscription : 14 Juil 2013 18:30

Re: [WIP] - GOT#VR

Message par E3DStef » 10 Oct 2018 11:44

axel a écrit :
10 Oct 2018 09:48
le translate c'est bien gentil, ça va vite à faire,
C'est exactement le postulat de mon WIP, pas d'optim - facile à faire - rapide à faire
axel a écrit :
10 Oct 2018 09:48
Genre devoir inverser la rotation quand tu recules...
Oui oui d'ailleurs si tu as lu mon EPISODE 1 à la fin tu as noté que je parlais d'un correctif à faire en inversant la rotation en marche arrière
axel a écrit :
10 Oct 2018 09:48
Il existe le wheelcollider et toute la physique pour gérer des véhicule dans Unity, je pense que ça serait plus approprié.
Excellente remarque, oui le WheelCollider est très bien pour les véhicules. J'ai bossé sur un simulateur de conduite d'engins et j'ai justement utilisé les wheelcollider !

Après notez :
Postulat N°1 : comme dit plus haut : je pars en mode dev débutant qui veut du résultat rapide avec du code simple.
Postulat N°2 : c'est un POC. S'il est concluant, on pourra modifier les éléments au fur et à mesure des itérations.
Postulat N°3 : c'est un Char. Donc pas de roues qui tournent (comme sur une voiture). Donc wheelcollider moins indispensables

Merci de vos retours/critiques/suggestions.

Bien entendu le projet est ouvert à tous, si certains veulent faire un morceau ils sont les bienvenus !

A+

Stef
Le Savoir n'est Précieux que s'il est Partagé

Si besoin urgent de me contacter, faites moi un mail sur : franceunity3d@gmail.com

Avatar de l’utilisateur
E3DStef
Administrateur
Administrateur
Messages : 1395
Inscription : 14 Juil 2013 18:30

Re: [WIP] - GOT#VR

Message par E3DStef » 21 Oct 2018 15:33

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

DeplacementCharNet.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
Le Savoir n'est Précieux que s'il est Partagé

Si besoin urgent de me contacter, faites moi un mail sur : franceunity3d@gmail.com

emile121153
Messages : 148
Inscription : 18 Mars 2017 19:39

Re: [WIP] - GOT#VR

Message par emile121153 » 21 Oct 2018 16:37

Pourquoi ne pas essayer Photon Unity Networking Classic - FREE
https://assetstore.unity.com/packages/t ... -free-1786

J'ai fait une tentative avec et ça n'a pas été très difficile comme mise en route.

C'est ensuite que j'ai eu un soucis que je ne suis pas arrivé à résoudre
http://www.unity3d-france.com/unity/php ... 12&t=15998

Je pense d'ailleurs qu'avec la gestion des joueurs pour les chars ou canons je trouverai la solution pour mon essai.

A bientôt

Répondre

Revenir vers « Vos créations, jeux, démos... »