[WIP] Lord of Twippies
[WIP] Lord of Twippies
Hello la compagnie
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 :
Un panneau de contrôle :
Drag & drop des objets :
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 !
++
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 :
Un panneau de contrôle :
Drag & drop des objets :
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 !
++
- boubouk50
- ModoGenereux
- Messages : 6225
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: [WIP] Lord of Twippies
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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Re: [WIP] Lord of Twippies
Haha ! Même pas figure toi (la honte )
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 !
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 !
- boubouk50
- ModoGenereux
- Messages : 6225
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: [WIP] Lord of Twippies
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.
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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Re: [WIP] Lord of Twippies
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
https://youtu.be/O6PJUoX65qk
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
https://youtu.be/O6PJUoX65qk
Re: [WIP] Lord of Twippies
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
'Til next time
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
'Til next time
Re: [WIP] Lord of Twippies
Vraiment très sympa cette feature!! chapeau.
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
______________________________________________________________
\_______________________ Impossible is nothing _______________________/
Re: [WIP] Lord of Twippies
Hello Djulio !
Merci pour ton retour
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
Ensuite, pour la partie déformation dynamique, voici ma méthode (avec des commentaires pour la compréhension ^^) :
Et je colle un
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 !
Merci pour ton retour
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
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"
}
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;
}
Code : Tout sélectionner
_mesh.RecalculateNormals();
_meshCollider.sharedMesh = _mesh;
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 !
Re: [WIP] Lord of Twippies
Alors oui pour le texturing je me doutais bien
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
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!
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);
En tout cas, chouete taf, hâte de voir la suite!
______________________________________________________________
\_______________________ Impossible is nothing _______________________/
Re: [WIP] Lord of Twippies
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 devrais essayer de calculer les vertex color en même temps que tu modifie ton mesh, et uniquement quand tu le modifie
Cool on va optimiser tout ça !tu peux juste utiliser length(v.vertex.xyz) qui te renvoi la longueur du vecteur position du vertex
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