[WIP] Lord of Twippies

Avatar de l’utilisateur
Sebela
Messages : 141
Inscription : 25 Juin 2014 21:39

[WIP] Lord of Twippies

Message par Sebela » 21 Nov 2018 12:11

Hello la compagnie :D

Allez je me lance. Lord of Twippies est un projet que j'avais commencé il y a looooongtemps, à l'époque de Blitz3D (vers 2011) alors que je codais sur les bancs de l'école à mon BTS informatique de gestion (nostalgie...)
Du coup, je me suis dis : maintenant qu'on a Unity, des outils carrément plus performants, et un peu plus de connaissances en prog, ça serait cool de déterrer ce projet sur lequel j'avais dû passer au moins 1 an !
Lord of Twippies, qu'est-ce donc ?? C'est un jeu dans lequel on se prend pour un dieu ^^ et on doit gérer le peuple des Twippies qui vivent "tranquillement" sur leur petite planète.

Le truc cool dans ce jeu, c'est qu'on peut tout contrôler, vu qu'on est un dieu. La vitesse de rotation du soleil, s'il pleut ou pas, le niveau de l'eau, la position des trucs, etc... j'ai dis tout ? Ah, en fait pas vraiment tout. Il est impossible de contrôler les choix des Twippies (libre arbitre), leurs émotions..., juste de les influencer. Qui a dit qu'être un dieu était facile ? ^^

Ma planète :
Image

Un panneau de contrôle :
Image

Drag & drop des objets :
Image

J'ai conscience que l'ampleur de ce projet est assez vaste, surtout pour la partie IA, mais j'aime ce projet et j'ai envie de relever le défi :) Et puis comme d'habitude, j'apprendrai sûrement de mes erreurs !
Hésitez pas à me laisser vos commentaires, ils sont les bienvenus !
++

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6186
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [WIP] Lord of Twippies

Message par boubouk50 » 21 Nov 2018 12:57

Je suppose que tu as dû saigner les Black & White.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
Sebela
Messages : 141
Inscription : 25 Juin 2014 21:39

Re: [WIP] Lord of Twippies

Message par Sebela » 21 Nov 2018 14:55

Haha ! Même pas figure toi (la honte :mrgreen: )
C'est marrant parce que quand j'ai présenté mon projet à un pote il y a quelques années, il m'a fait la même réflexion et du coup j'avais été voir ce dont il s'agissait :]
A croire que toutes les idées ont déjà été exploitées !

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6186
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [WIP] Lord of Twippies

Message par boubouk50 » 21 Nov 2018 15:30

Dans ce cas, je te les conseille vivement. Ils sont géniaux, même sans aller très loin, juste explorer les possibilités dans le premier monde par exemple.
Après c'est à double tranchant pour ton jeu, soit ça t'inspire, soit ça pervertit ta vision.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
Sebela
Messages : 141
Inscription : 25 Juin 2014 21:39

Re: [WIP] Lord of Twippies

Message par Sebela » 24 Nov 2018 23:17

Hello :)

Petit update sur l'avancement de Lord Of Twippies : La mise en place du Drag&Drop des éléments du décor.
Une petite vidéo pour vous montrer à quoi ça ressemble :super:

https://youtu.be/O6PJUoX65qk

Avatar de l’utilisateur
Sebela
Messages : 141
Inscription : 25 Juin 2014 21:39

Re: [WIP] Lord of Twippies

Message par Sebela » 27 Nov 2018 00:36

Hello !

Nouvel update de l'avancement de mon jeu : le shape mode :)
Celui-ci permet de remodeler directement la planète et de changer dynamiquement la texture de celle-ci. Le collider est également mis à jour dynamiquement ce qui fait qu'on peut parfaitement faire pousser une montagne sous les pieds d'un twippie sans l'engloutir dedans ;)

Petite démo :
https://www.youtube.com/watch?v=Ofq0Gc4qXV8&feature=youtu.be

Faites-moi signe si vous êtes intéressés par la méthode :super:
'Til next time

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: [WIP] Lord of Twippies

Message par djulio74 » 27 Nov 2018 01:32

Sebela a écrit :
27 Nov 2018 00:36

Nouvel update de l'avancement de mon jeu : le shape mode :)
Vraiment très sympa cette feature!! chapeau. :super:
Je serais intéressé de savoir le méthode que tu utilise.
Et par curiosité, combien de vertex possède ta planète?

En tout cas continue ainsi, et hâte de pouvoir y faire mumuse quand tu partagera un build :P ;-)

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Avatar de l’utilisateur
Sebela
Messages : 141
Inscription : 25 Juin 2014 21:39

Re: [WIP] Lord of Twippies

Message par Sebela » 27 Nov 2018 10:51

Hello Djulio !

Merci pour ton retour :merci:
Alors, concrètement, comment ça marche ? ^^
Pour la partie texturing dynamique, tu es assez au fait de la question parce que c'est grâce à toi que j'ai pu le mettre en place ;-)

Voici mon shader (où j'avais repris ton idée de multiplier la texture par la couleur pour afficher une texture différente par altitude) => J'ai ensuite simplement eu à récupérer la distance entre le vertex et transform.position pour déterminer la texture à afficher. J'ai mis en place 4 paliers avec des conditions (si hauteur > palier1 && hauteur < palier2 => texture1 ...)
Ps : je découvre tout doucement les shaders donc mon code est potentiellement cracra :mrgreen:

Code : Tout sélectionner

Shader "Custom/FinalCustomTex" {
    Properties {
		_MainTex1 ("Tex1", 2D) = "white" {}
		_MainTex2 ("Tex2", 2D) = "white" {}
		_MainTex3 ("Tex3", 2D) = "white" {}
		_MainTex4 ("Tex4", 2D) = "white" {}
		_MainTex5 ("Tex5", 2D) = "white" {}
		_RED("Red", Color) = (1.0, 0, 0, 0)
		_GREEN("Green", Color) = (0, 1.0, 0, 0)
		_BLUE("Blue", Color) = (0, 0, 1.0, 0)
		_PURPLE("Purple", Color) = (1.0, 0, 1.0, 0)
		_ALPHA("Alpha", Color) = (0, 0, 0, 1.0)
		_Rayon ("Rayon", FLOAT) = 10
		_Step1 ("Step1", FLOAT) = 1
		_Step2 ("Step2", FLOAT) = 1
		_Step3 ("Step3", FLOAT) = 1

    }
    SubShader {    

      	Tags { "RenderType" = "Opaque" }
      	
      	 LOD 300
      	CGPROGRAM
      	#pragma surface surf Lambert vertex:vert 
     	#pragma target 5.0
            
      struct Input {
          float2 uv_MainTex1;
		  float2 uv_MainTex2;
		  float2 uv_MainTex3;
		  float2 uv_MainTex4;
		  float2 uv_MainTex5;
          half4 COL;
		  half4 COL1;  
      }; 
      float4 _RED;
	  float4 _GREEN;
	  float4 _BLUE;
	  float4 _PURPLE;
	  float4 _ALPHA;
	  float _Rayon;
	  float _Step1;
	  float _Step2;
	  float _Step3;
      void vert (inout appdata_full v, out Input o) {
          UNITY_INITIALIZE_OUTPUT(Input,o);
		  float4 objectOrigin = unity_ObjectToWorld[3];
          float4 worldPos = mul(unity_ObjectToWorld, v.vertex);
          float dist = distance(objectOrigin, worldPos);
		  if (dist <= _Rayon){
		  	  v.color = _RED;
		  }else if (dist > _Rayon && dist <= _Rayon+_Step1){
			  v.color = _GREEN;
		  }else if (dist > _Rayon+_Step1 && dist <= _Rayon+_Step1+_Step2){
			  v.color = _BLUE;
		  }else if (dist > _Rayon+_Step1+_Step2 && dist <= _Rayon+_Step1+_Step2+_Step3){
			  v.color = _PURPLE;
		  }
		  else{
			  v.color = _ALPHA;
		  }
          o.COL.r = max(v.color.r-v.color.b*v.color.b-v.color.g*v.color.g-v.color.a*v.color.a ,0.0) ;
          o.COL.g = max(v.color.b-v.color.r*v.color.r-v.color.g*v.color.g-v.color.a*v.color.a ,0.0) ;
          o.COL.b = max(v.color.g-v.color.r*v.color.r-v.color.b*v.color.b-v.color.a*v.color.a ,0.0) ;
          o.COL.a = max(v.color.a-v.color.r*v.color.r-v.color.g*v.color.g-v.color.b*v.color.b ,0.0) ;
		  o.COL1.r = max(v.color.r+v.color.b-v.color.g*v.color.g-v.color.a*v.color.a ,0.0) ;
      }      
      
      sampler2D _MainTex1;
      sampler2D _MainTex2;
      sampler2D _MainTex3;
      sampler2D _MainTex4;
      sampler2D _MainTex5;
      void surf (Input IN, inout SurfaceOutput o) {
      
		half3 Col1 = (IN.COL.r) * tex2D (_MainTex1, IN.uv_MainTex1).rgb;
		half3 Col2 = (IN.COL.g) * tex2D (_MainTex2, IN.uv_MainTex2).rgb;
		half3 Col3 = (IN.COL.b) * tex2D (_MainTex3, IN.uv_MainTex3).rgb;
		half3 Col4 = (IN.COL.a) * tex2D (_MainTex4, IN.uv_MainTex4).rgb;
		half3 Col5 = (IN.COL1.r) * tex2D (_MainTex5, IN.uv_MainTex5).rgb;
		o.Albedo = Col1 + Col2 + Col3 + Col4 + Col5;

      }
      ENDCG
    }
    
    Fallback "Diffuse"
  }
Ensuite, pour la partie déformation dynamique, voici ma méthode (avec des commentaires pour la compréhension ^^) :

Code : Tout sélectionner


    protected virtual void Deform(Vector3 point, float force)
    {
        point = transform.InverseTransformPoint(point);
        for (int i = 0; i < _deformedVertices.Length; i++)
        {
            AddForceToVertex(i, point, force);
        }
    }

	protected void AddForceToVertex(int i, Vector3 point, float force)
    {
        Vector3 pointToVertex = _deformedVertices[i] - point; //distance de chaque vertice au point touché
        Vector3 direction = transform.position - point; // distance du centre au point touché
        float attenuatedForce = force / (1f + pointToVertex.sqrMagnitude); //Force appliquée au vertice selon la distance au point touché (plus distance courte, plus force élevée)
        float velocity = attenuatedForce * Time.deltaTime;
        if (Vector3.Distance(_deformedVertices[i], _originalVertices[i]) < 5) //Limite de magnitude de la déformation
            _vertexVelocities[i] += direction.normalized * velocity; //Direction opposée au centre, force selon attenuatedForce
    }

    protected void UpdateVertex(int i)
    {
        Vector3 velocity = _vertexVelocities[i]; // Récupération de la force appliquée au vertice
        if (Input.GetMouseButton(0))
        {
            _updatedVertices[i] = _deformedVertices[i]; //Update du vertice si bouton appuyé
        }
        Vector3 deplacement = _deformedVertices[i] - _updatedVertices[i]; //Distance de déplacement du vertice depuis l'original
        velocity -= deplacement *5* Time.deltaTime; //plus le point est déplacé, moins il va vite
        velocity *= 1f - 5 * Time.deltaTime; //Réduction progressive de la vélocité pour éviter que ça rebondisse
        _vertexVelocities[i] = velocity;
        _deformedVertices[i] += velocity * Time.deltaTime;
    }
Et je colle un

Code : Tout sélectionner

_mesh.RecalculateNormals();
_meshCollider.sharedMesh = _mesh;
dans mon update() si shape mode activé
pour recalculer le collider en fonction de la déformation
Je me suis bien amusé sur celui-là ^^ Disons qu'à un moment, quand je déformais ma planète, j'avais mis en place un effet de "rebond" pour que la forme se remette en place (j'ai finalement enlevé cet effet parce qu'il était joli mais pas très utile)
Voilà :) Si y a un truc pas clair hésite pas !

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: [WIP] Lord of Twippies

Message par djulio74 » 27 Nov 2018 12:54

Alors oui pour le texturing je me doutais bien ::d
Cela dit je ne sais pas quelles seront les autres possibilité de ton jeux, mais vu que tu as déjà une déformation personnalisable, cela m’entonnerais pas que tu ai aussi besoin de pouvoir peindre ta planète, customiser la texture à telle ou telle endroit ( sous un bâtiment, rajouter un banc de sable ..etc).
Chose qui deviendra compliqué vu que c'est le shader qui calcul la couleur des vertex en fonction de l'altitude. Certes le shader ( donc le GPU) est beaucoup plus rapide au calcul, mais du coup il le fait en permanence. Tu devrais essayer de calculer les vertex color en même temps que tu modifie ton mesh, et uniquement quand tu le modifie ;-)

Si jamais tu veux rester sur le calcul dans le shader :
- tu fais une opération inutile dans le sens ou tu récupère le position world de ta planete, et transpose en worldposition tes vertex pour calculer la distance entre ta planète et le vertex. Mais si ta planete a bien son pivot au centre ( comme la sphere de base de unity) tu peux juste utiliser length(v.vertex.xyz) qui te renvoi la longueur du vecteur position du vertex, donc la distance du vertex par rapport au centre de la planete

Code : Tout sélectionner

      void vert (inout appdata_full v, out Input o) {
          UNITY_INITIALIZE_OUTPUT(Input,o);
	  // a supprimer //  float4 objectOrigin = unity_ObjectToWorld[3];
          // a supprimer //  float4 worldPos = mul(unity_ObjectToWorld, v.vertex);
          float dist = length(v.vertex.xyz);
  
Pour la partie déformation, je pense avoir saisie le principal, même si a mon avis dans le code que tu as posté il doit manquer la partie du raycast.;)

En tout cas, chouete taf, hâte de voir la suite! :super:

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Avatar de l’utilisateur
Sebela
Messages : 141
Inscription : 25 Juin 2014 21:39

Re: [WIP] Lord of Twippies

Message par Sebela » 27 Nov 2018 19:11

Tu devrais essayer de calculer les vertex color en même temps que tu modifie ton mesh, et uniquement quand tu le modifie ;-)
Je vais réfléchir à ça. C'est vrai que j'étais épaté de voir à quelle vitesse le gpu fait ses calculs ! (aucun lag sur un pc assez ancien alors que la texture est calculée en permanence) Si c'est pas trop compliqué à gérer par le code je vais essayer de faire évoluer ça.
tu peux juste utiliser length(v.vertex.xyz) qui te renvoi la longueur du vecteur position du vertex
Cool :D on va optimiser tout ça !

Oui effectivement, pour utiliser la déformation il faut aussi ce bout de code :

Code : Tout sélectionner

protected override void OnMouseOver()
    {
        if (_shaping)
        {

            Ray inputRay = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;

            if (Physics.Raycast(inputRay, out hit) && Input.GetMouseButton(0))
            {
                Deform(hit.point, _shapingStrength);
            }
        }
    }

Merci pour tes conseils :)

Répondre

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