public void fillRootAndChildData(SmwCharacter characterSO, Teams teamId, SmwCharacterGenerics charGenerics)
    {
        float leftPos   = -20f; // TODO inspector
        float rightPos  = 20f;  // TODO inspector
        float topPos    = 15f;  // TODO inspector
        float bottomPos = -15f; // TODO inspector

        Vector3 rootTransformPos   = Vector3.zero;
        Vector3 centerTransformPos = rootTransformPos;
        Vector3 leftTransformPos   = new Vector3(leftPos, 0f, 0f);
        Vector3 rightTransformPos  = new Vector3(rightPos, 0f, 0f);
        Vector3 topTransformPos    = new Vector3(0f, topPos, 0f);
        Vector3 bottomTransformPos = new Vector3(0f, bottomPos, 0f);
        Vector3 headTransformPos   = new Vector3(0f, 0.3f, 0f);
        Vector3 feetTransformPos   = new Vector3(0f, -0.3f, 0f);
        Vector3 bodyTransformPos   = new Vector3(0f, 0f, 0f);
        //Vector3 itemCollectorTransformPos = new Vector3(0f,0f,0f);
        //Vector3 powerHitTransformPos =        new Vector3(0f,0f,0f);
        Vector3 groundStopperTransformPos = new Vector3(0f, -0.25f, 0f);
        Vector3 kingTransformPos          = new Vector3(0f, 0.6f, 0f);
//        Vector3 frictionEffectTransformPos = new Vector3(-0.42f, -0.42f, 0f);

        Vector2 headBoxSize = new Vector2(0.7f, 0.25f);
        //Vector2 feetBoxSize = new Vector2(0.7f,0.25f);
        Vector2 bodyBoxSize = new Vector2(0.7f, 0.8f);
        //Vector2 itemCollectorBoxSize = new Vector2(0.7f,0.8f);
        //Vector2 powerHitBoxSize = new Vector2(0.7f,0.8f);
        Vector2 groundStopperBoxSize = new Vector2(0.7f, 0.5f);

        Vector2 colliderOffSetCenter = Vector2.zero;
        Vector2 colliderOffSetLeft   = new Vector2(leftPos, 0f);
        Vector2 colliderOffSetRight  = new Vector2(rightPos, 0f);

        //			Vector2 headBoxOffset; // use smartOffset
        //			Vector2[] headBoxOffset = new Vector2[3];
        //			headBoxOffset [0] = colliderOffSetCenter;
        //			headBoxOffset [1] = colliderOffSetLeft;
        //			headBoxOffset [2] = colliderOffSetRight;
        Vector2[] smartComponentOffset = new Vector2[3];
        smartComponentOffset[0] = colliderOffSetCenter;
        smartComponentOffset[1] = colliderOffSetLeft;
        smartComponentOffset[2] = colliderOffSetRight;

        bool headIsTrigger = true;
        //bool feetIsTrigger = true;
        bool bodyIsTrigger = false;
        //bool itemCollectorIsTrigger = true;
        //bool powerHitAreaIsTrigger = true;
        bool groundStopperIsTrigger = false;

        // root
        root = new ChildData(characterSO.charName, TagManager.Instance.tag_player, LayerManager.Instance.playerLayerName, centerTransformPos);     //TODO Achtung PrefabName und Name können isch unterscheieden!!!
        root.Add(root.gameObject.AddComponent <SpriteRenderer>(), true, characterSO.GetSprites(teamId, SmwCharacterAnimation.Idle)[0], charGenerics.color_rootRenderer, charGenerics.rootRendererSortingLayer);
        Animator anim = root.Add(root.gameObject.AddComponent <Animator>(), true, characterSO.GetRuntimeAnimationController(teamId));              //TODO inspector
//		root.Add(root.gameObject.AddComponent<Rigidbody2D>(), 1f, true);    //TODO inspector
        float gravityScale = 1f;
        float linearDrag   = 3f;

        root.Add(root.gameObject.AddComponent <Rigidbody2D>(), gravityScale, RigidbodyConstraints2D.FreezeRotation, linearDrag);           //TODO inspector
        root.Add(root.gameObject.AddComponent <AudioSource>(), true);
        //root.Add(root.gameObject.AddComponent<RealOwner>(), true);

        NetworkIdentity netIdScript = root.gameObject.AddComponent <NetworkIdentity> ();

        netIdScript.localPlayerAuthority = true;

        PlatformUserControl     platformUserControl = root.gameObject.AddComponent <PlatformUserControl>();
        PlatformCharacterScript platformCharScript  = root.gameObject.AddComponent <PlatformCharacterScript>();

        // build > 0.701
        // add CharSO to CharPrefab
        platformCharScript.SetSmwCharacterSO(characterSO);
        root.Add(platformCharScript, true);
        root.Add(root.gameObject.AddComponent <PlatformJumperScript>(), false);                  // useUnityPhysics
        //root.Add(root.gameObject.AddComponent<Rage>(), true);
        //root.Add(root.gameObject.AddComponent<Shoot>(), true);
        //root.Add(root.gameObject.AddComponent<Shield>(), true);
        if (networked)
        {
            NetworkedPlayer netPlayerScript = root.gameObject.AddComponent <NetworkedPlayer> ();
            root.Add(netPlayerScript, true);
            netPlayerScript.AddBehaviour(platformCharScript);
            netPlayerScript.AddBehaviour(platformUserControl);

            NetworkAnimator netAnim = root.gameObject.AddComponent <NetworkAnimator> ();
            netAnim.animator = anim;

            NetworkTransform netTransform = root.gameObject.AddComponent <NetworkTransform> ();
            netTransform.transformSyncMode = NetworkTransform.TransformSyncMode.SyncRigidbody2D;
            netTransform.movementTheshold  = (float)0.001f;
            netTransform.snapThreshold     = 5f;
            float sendRate = 20.0f;                                     // amount per seconds
            netTransform.sendInterval     = 1.0f / sendRate;            // time in seconds
            netTransform.syncRotationAxis = NetworkTransform.AxisSyncMode.None;
            //netTransform.syncRotationAxis = NetworkTransform.AxisSyncMode.AxisZ;
            netTransform.interpolateRotation     = 1f;
            netTransform.rotationSyncCompression = NetworkTransform.CompressionSyncMode.High;
        }
//        root.Add(root.gameObject.AddComponent<NetworkView>(), true, netPlayerScript);
        //root.Add(root.gameObject.AddComponent<PushSkript>(), false);
        //root.Add(root.gameObject.AddComponent<Bot>(), false);


        // Clone Left
        ChildData child = new ChildData(TagManager.Instance.name_cloneLeft, TagManager.Instance.tag_player_clone, LayerManager.Instance.playerLayerName, leftTransformPos);

        child.Add(child.gameObject.AddComponent <SpriteRenderer>(), true, characterSO.GetSprites(teamId, SmwCharacterAnimation.Idle)[0], charGenerics.color_rootCloneRenderer, charGenerics.rootCloneRendererSortingLayer);
        child.Add(child.gameObject.AddComponent <CloneSpriteScript>(), true);
        childs.Add(child);

        // Clone Right
        child = new ChildData(TagManager.Instance.name_cloneRight, TagManager.Instance.tag_player_clone, LayerManager.Instance.playerLayerName, rightTransformPos);
        child.Add(child.gameObject.AddComponent <SpriteRenderer>(), true, characterSO.GetSprites(teamId, SmwCharacterAnimation.Idle)[0], charGenerics.color_rootCloneRenderer, charGenerics.rootCloneRendererSortingLayer);
        child.Add(child.gameObject.AddComponent <CloneSpriteScript>(), true);
        childs.Add(child);

        // Clone Top
        child = new ChildData(TagManager.Instance.name_CloneTop, TagManager.Instance.tag_player_clone, LayerManager.Instance.playerLayerName, topTransformPos);
        child.Add(child.gameObject.AddComponent <SpriteRenderer>(), true, characterSO.GetSprites(teamId, SmwCharacterAnimation.Idle)[0], charGenerics.color_rootCloneRenderer, charGenerics.rootCloneRendererSortingLayer);
        child.Add(child.gameObject.AddComponent <CloneSpriteScript>(), true);
        childs.Add(child);

        // Clone Bottom
        child = new ChildData(TagManager.Instance.name_CloneBottom, TagManager.Instance.tag_player_clone, LayerManager.Instance.playerLayerName, bottomTransformPos);
        child.Add(child.gameObject.AddComponent <SpriteRenderer>(), true, characterSO.GetSprites(teamId, SmwCharacterAnimation.Idle)[0], charGenerics.color_rootCloneRenderer, charGenerics.rootCloneRendererSortingLayer);
        child.Add(child.gameObject.AddComponent <CloneSpriteScript>(), true);
        childs.Add(child);

        // Head (cloned)
        child = new ChildData(TagManager.Instance.name_head, TagManager.Instance.tag_head, LayerManager.Instance.headLayerName, headTransformPos);
        child.Add(child.gameObject.AddComponent <BoxCollider2D>(), true, headBoxSize, smartComponentOffset, headIsTrigger, 3);
        childs.Add(child);

        //// Feet (cloned)
        child = new ChildData(TagManager.Instance.name_feet, TagManager.Instance.tag_player, LayerManager.Instance.feetLayerName, feetTransformPos);
        //child.Add(child.gameObject.AddComponent<BoxCollider2D>(), true, feetBoxSize, smartComponentOffset, feetIsTrigger, 3);
        //child.Add(child.gameObject.AddComponent<SendDamageTrigger>(),true);
        childs.Add(child);

        // Body (cloned)
        child = new ChildData(TagManager.Instance.name_body, TagManager.Instance.tag_body, LayerManager.Instance.bodyLayerName, bodyTransformPos);
        child.Add(child.gameObject.AddComponent <BoxCollider2D>(), true, bodyBoxSize, smartComponentOffset, bodyIsTrigger, 3);
        childs.Add(child);

        //// ItemCollector (cloned)
        //child = new ChildData (Tags.Instance.name_itemCollector, Tags.Instance.tag_itemCollector, Layer.Instance.itemLayerName, itemCollectorTransformPos);
        //child.Add(child.gameObject.AddComponent<BoxCollider2D>(), true, itemCollectorBoxSize, smartComponentOffset, itemCollectorIsTrigger, 3);
        //child.Add(child.gameObject.AddComponent<ItemCollectorScript>(),true);
        //childs.Add (child);

        //// PowerHitArea (cloned)
        //child = new ChildData (Tags.Instance.name_powerUpHitArea, Tags.Instance.tag_powerUpHitArea, Layer.Instance.powerUpLayerName, powerHitTransformPos);
        //child.Add(child.gameObject.AddComponent<BoxCollider2D>(), true, powerHitBoxSize, smartComponentOffset, powerHitAreaIsTrigger, 3);
        //child.Add(child.gameObject.AddComponent<RageTrigger>(),true);
        //childs.Add (child);

        // GroundStopper
        child = new ChildData(TagManager.Instance.name_groundStopper, TagManager.Instance.tag_groundStopper, LayerManager.Instance.groundStopperLayerName, groundStopperTransformPos);
        child.Add(child.gameObject.AddComponent <BoxCollider2D>(), true, groundStopperBoxSize, smartComponentOffset, groundStopperIsTrigger, 1);
        childs.Add(child);

        // King
        child = new ChildData(TagManager.Instance.name_king, TagManager.Instance.tag_body, LayerManager.Instance.defaultLayerName, kingTransformPos);
        child.Add(child.gameObject.AddComponent <SpriteRenderer>(), false, charGenerics.kingSprite, charGenerics.color_kingRenderer, charGenerics.kingRendererSortingLayer);
        childs.Add(child);

        // CurrentEstimatedPosOnServer
        child = new ChildData(TagManager.Instance.name_CurrentEstimatedPosOnServer, TagManager.Instance.tag_CurrentEstimatedPosOnServer, LayerManager.Instance.defaultLayerName, centerTransformPos);
        child.Add(child.gameObject.AddComponent <SpriteRenderer>(), true, characterSO.GetSprites(teamId, SmwCharacterAnimation.Idle)[0], charGenerics.color_currentEstimatedPosOnServer, charGenerics.currentEstimatedPosOnServerSortingLayer);
        childs.Add(child);

        // LastRecvedPos
        child = new ChildData(TagManager.Instance.name_lastReceivedPos, TagManager.Instance.tag_lastReceivedPos, LayerManager.Instance.defaultLayerName, centerTransformPos);
        child.Add(child.gameObject.AddComponent <SpriteRenderer>(), true, characterSO.GetSprites(teamId, SmwCharacterAnimation.Idle)[0], charGenerics.color_LastRecvedPos, charGenerics.lastRecvdPosRendererSortingLayer);
        childs.Add(child);

        // PredictedPosSimulatedWithLastInput
        child = new ChildData(TagManager.Instance.name_PredictedPosSimulatedWithLastInput, TagManager.Instance.tag_PredictedPosSimulatedWithLastInput, LayerManager.Instance.defaultLayerName, centerTransformPos);
        child.Add(child.gameObject.AddComponent <SpriteRenderer>(), true, characterSO.GetSprites(teamId, SmwCharacterAnimation.Idle)[0], charGenerics.color_PredictedPosSimulatedWithLastInput, charGenerics.preSimPosRendererSortingLayer);
        childs.Add(child);

        // PredictedPosCalculatedWithLastInput
        child = new ChildData(TagManager.Instance.name_PredictedPosCalculatedWithLastInput, TagManager.Instance.tag_PredictedPosCalculatedWithLastInput, LayerManager.Instance.defaultLayerName, centerTransformPos);
        child.Add(child.gameObject.AddComponent <SpriteRenderer>(), true, characterSO.GetSprites(teamId, SmwCharacterAnimation.Idle)[0], charGenerics.color_PredictedPosCalculatedWithLastInput, charGenerics.preCalclastRecvdPosRendererSortingLayer);
        childs.Add(child);

        // IceWalled
        child = new ChildData(TagManager.Instance.name_iceWalled, TagManager.Instance.tag_iceWalled, LayerManager.Instance.defaultLayerName, centerTransformPos);
        child.Add(child.gameObject.AddComponent <SpriteRenderer>(), true, null, charGenerics.color_iceWallRenderer, charGenerics.iceWalledRendererSortingLayer);
        child.Add(child.gameObject.AddComponent <Animator>(), true, charGenerics.iceWandAnimatorController);
        childs.Add(child);

        // Friction Effect with Prefav
        GameObject frictionEffectChildGO = GameObject.Instantiate(charGenerics.frictionSmokeTrailPrefab);

        frictionEffectChildGO.transform.SetParent(root.gameObject.transform);
        frictionEffectChildGO.name       = TagManager.Instance.name_frictionEffect;
        platformCharScript.FrictionSmoke = frictionEffectChildGO.GetComponent <ParticleSystem> ();

        // Friction Effect manual creation
//		child = new ChildData (TagManager.Instance.name_frictionEffect, TagManager.Instance.tag_frictionEffect, LayerManager.Instance.defaultLayerName, frictionEffectTransformPos);
//		foreach (Component c in charGenerics.frictionSmokeTrailPrefab.GetComponents()) {
//			child.Add(child.gameObject.AddComponent(c));
//		}
    }