2016-04-14 1 views
0

Je suivais cet exemple de fractale Unité:Comment est localScale réducteur dans cet exemple de code fractale pour l'unité

http://catlikecoding.com/unity/tutorials/constructing-a-fractal/

using UnityEngine; 
using System.Collections; 

public class Fractal : MonoBehaviour { 

    public Mesh mesh; 
    public Material material; 
    public int maxDepth = 20; 
    public int depth = 0; 
    public float childScale = 0.5f; 

    // Use this for initialization 
    void Start() { 
     gameObject.AddComponent<MeshFilter>().mesh = mesh; 
     gameObject.AddComponent<MeshRenderer>().material = material; 
     if(depth < maxDepth) 
     { 
      new GameObject("Fractal Child").AddComponent<Fractal>().Initialise(this); 

     } 
    } 

    // Update is called once per frame 
    void Update() { 

    } 

    private void Initialise(Fractal parent) 
    { 
     Debug.Log(gameObject.transform.localScale); 
     mesh = parent.mesh; 
     material = parent.material; 
     maxDepth = parent.maxDepth; 
     childScale = parent.childScale; 
     Debug.Log("childScale = " + childScale); 
     depth = parent.depth + 1; 
     transform.parent = parent.transform; 
     transform.localScale = Vector3.one * childScale; 
     Debug.Log("localScale = " + transform.localScale); 
     transform.localPosition = Vector3.up * (0.5f + 0.5f * childScale); 
    } 
} 

Jusqu'à ce point, j'ai une pile verticale de boîtes sur le dessus de chaque autre, où chaque boîte est la moitié de la taille de la boîte ci-dessous (childScale est réglé sur 0.5f). Ce que je n'arrive pas à comprendre, c'est pourquoi chaque gameobject (instance Fractal) a la moitié de la taille de son parent. childScale est toujours 0.5f, je ne vois pas comment il serait réduit à 0.25f, 0.125f etc dans ce code pour faire chaque instance qui est créée récursivement - la moitié de la taille de son parent.

Un conseil apprécié.

L'image ci-dessous est le résultat (notez que ceci utilise une échelle enfant de 0.9f pas 0.5f).

enter image description here

Répondre

0

L'échelle représentée dans l'éditeur est l'échelle locale. L'échelle locale est relative au parent de la transformation. L'exemple fractal est imbriqué. Donc, si votre parent de premier niveau a une échelle locale de 0,5, c'est aussi une échelle mondiale de 0,5, car il n'a pas de parent. Votre prochain objet vers le bas est .5 échelle locale, mais (.5 * .5) échelle mondiale. L'objet suivant est .5 échelle locale, (.5 * .5 * .5) échelle mondiale. Voyez où va ce trou de lapin? :)

+0

Salut, donc c'est seulement la ligne qui affecte le transform.parent qui cause réellement la réduction d'échelle? En faisant d'elle un enfant d'un autre objet, l'échelle locale entre en jeu. – smackenzie

+0

Permettez-moi de le dire de cette façon. Echelle mondiale = échelle locale * échelle mondiale du parent. Lorsque l'unité fait le calcul ci-dessus, elle commence en haut et descend. L'échelle mondiale est appelée "échelle à perte" en passant. La définition du parent n'est pas ce qui provoque la réduction d'échelle, indiquant à l'objet qu'il fait la moitié de la taille de son parent. – Allen

+0

Alors, que se passe-t-il si je refais soudainement un autre objet de jeu avec une échelle différente? L'acte de reparent ne le fera-t-il pas réévaluer son échelle locale par rapport à son nouveau parent? – smackenzie