Ejemplo n.º 1
0
    public override void OnAssembled(EnumEquipSlot slot, GameObject go, FC_EQUIPMENTS_TYPE equipmentType)
    {
        //_bladeInfosIdx = 0;
        if (_bladeInfos != null && _bladeInfosIdx >= _bladeInfos.Length)
        {
            _bladeInfosIdx = 0;
        }
        Transform []           transforms = go.GetComponentsInChildren <Transform>();
        List <GameObject>      gl         = new List <GameObject>();
        List <MessageReciever> ml         = new List <MessageReciever>();
        List <BladeSlide>      bl         = new List <BladeSlide>();

        _bladeInfos[_bladeInfosIdx] = new BladeInfo();

        _bladeInfos[_bladeInfosIdx]._bladeType         = equipmentType;
        _bladeInfos[_bladeInfosIdx]._bladeTransform    = go.transform;
        _bladeInfos[_bladeInfosIdx]._originalTransform = go.transform.parent;
        _bladeInfos[_bladeInfosIdx]._currentTransform  = go.transform.parent;

        foreach (Transform t in transforms)
        {
            GameObject subgo = t.gameObject;
            Collider   c     = subgo.GetComponent <Collider>();
            if (c != null)
            {
                gl.Add(subgo);
            }

            MessageReciever mr = subgo.GetComponent <MessageReciever>();
            if (mr != null)
            {
                ml.Add(mr);
            }
            BladeSlide blade = subgo.GetComponent <BladeSlide>();
            if (blade != null)
            {
                bl.Add(blade);
            }
        }

        _bladeInfos[_bladeInfosIdx]._colliders        = gl.ToArray();
        _bladeInfos[_bladeInfosIdx]._messageReceivers = ml.ToArray();
        _bladeInfos[_bladeInfosIdx]._bladerCenter     = new Vector3[_bladeInfos[_bladeInfosIdx]._colliders.Length];
        _bladeInfos[_bladeInfosIdx]._bladerSize       = new Vector3[_bladeInfos[_bladeInfosIdx]._colliders.Length];
        _bladeInfos[_bladeInfosIdx]._bladeReal        = new BoxCollider[_bladeInfos[_bladeInfosIdx]._colliders.Length];
        _bladeInfos [_bladeInfosIdx].cubes            = new GameObject[_bladeInfos [_bladeInfosIdx]._colliders.Length];

        if (_bladeInfos[_bladeInfosIdx]._colliders.Length != 0)
        {
            for (int i = 0; i < _bladeInfos[_bladeInfosIdx]._colliders.Length; i++)
            {
                _bladeInfos[_bladeInfosIdx]._bladeReal[i]             = _bladeInfos[_bladeInfosIdx]._colliders[i].collider as BoxCollider;
                _bladeInfos[_bladeInfosIdx]._bladerCenter[i]          = _bladeInfos[_bladeInfosIdx]._bladeReal[i].center;
                _bladeInfos[_bladeInfosIdx]._bladerSize[i]            = _bladeInfos[_bladeInfosIdx]._bladeReal[i].size;
                _bladeInfos[_bladeInfosIdx].cubes[i]                  = GameObject.CreatePrimitive(PrimitiveType.Cube);
                _bladeInfos[_bladeInfosIdx].cubes[i].transform.parent = go.transform;
                _bladeInfos[_bladeInfosIdx].cubes[i].transform.gameObject.SetActive(false);
            }
        }

        _bladeInfos[_bladeInfosIdx]._bladeSlide = bl.ToArray();
        _bladeInfosIdx++;
    }
Ejemplo n.º 2
0
    void OnWizardCreate()
    {
        foreach (GameObject go in _weaponModels)
        {
            string     path    = AssetDatabase.GetAssetPath(go);
            GameObject inst    = GameObject.Instantiate(go, Vector3.zero, Quaternion.identity) as GameObject;
            string     matPath = path.ToLower().Replace(".fbx", ".mat");
            matPath = matPath.Replace("_left", "");
            matPath = matPath.Replace("_right", "");
            Material mat = AssetDatabase.LoadAssetAtPath(matPath, typeof(Material)) as Material;
            // collect mesh renderers. Most of weapons has only 1 renderer.
            Renderer [] renderers = inst.GetComponentsInChildren <Renderer>();
            // get max bounding box.
            Bounds bnd = renderers[0].bounds;
            for (int i = 1; i < renderers.Length; ++i)
            {
                if (renderers[i].gameObject.tag == "")
                {
                    bnd.Encapsulate(renderers[i].bounds);
                }
            }
            // add blade slide.
            if (_addBladeSlide && path.Contains("_mid.") && renderers.Length > 0)
            {
                BladeSlide bs = inst.AddComponent <BladeSlide>();
                GameObject a  = new GameObject("A");
                a.transform.parent        = inst.transform;
                a.transform.localPosition = Vector3.forward * bnd.max.z;
                GameObject b = new GameObject("B");
                b.transform.parent        = inst.transform;
                b.transform.localPosition = Vector3.forward * (bnd.min.z + bnd.size.z * 0.25f);
                bs.PointA        = a.transform;
                bs.PointB        = b.transform;
                bs.BladeMaterial = AssetDatabase.LoadAssetAtPath("Assets/Weapon/Common/Blade/swing_default.mat", typeof(Material)) as Material;
            }

            if (path.Contains("_mid."))
            {
                // add physics collider & callback script.
                GameObject weaponCollider = new GameObject("Collider");
                bool       isHero         = false;
                if (path.StartsWith("Assets/Weapon/Warrior/") ||
                    path.StartsWith("Assets/Weapon/Monk/") ||
                    path.StartsWith("Assets/Weapon/Mage/"))
                {
                    isHero = true;
                }
                if (isHero)
                {
                    weaponCollider.AddComponent <PlayerMessageReceiver>();
                }
                else
                {
                    weaponCollider.AddComponent <MessageReciever>();
                }
                BoxCollider bc = weaponCollider.AddComponent <BoxCollider>();
                bc.center    = bnd.center;
                bc.size      = bnd.size;
                bc.isTrigger = true;
                GameObject oldGo = AssetDatabase.LoadAssetAtPath(path.Replace(".fbx", ".prefab"), typeof(GameObject)) as GameObject;
                if (oldGo != null)
                {
                    oldGo = GameObject.Instantiate(oldGo) as GameObject;
                    BoxCollider oldBc = oldGo.GetComponentInChildren <BoxCollider>();
                    if (oldBc != null)
                    {
                        bc.center = oldBc.center;
                        bc.size   = oldBc.size;
                    }
                    GameObject.DestroyImmediate(oldGo);
                }
                weaponCollider.transform.parent        = inst.transform;
                weaponCollider.transform.localPosition = Vector3.zero;
                weaponCollider.transform.localRotation = Quaternion.identity;
                weaponCollider.transform.localScale    = Vector3.one;

                if (isHero)
                {
                    // hook upgrade effect.
                    foreach (GameObject upgrade in _upgradeEffects)
                    {
                        GameObject    u             = GameObject.Instantiate(upgrade) as GameObject;
                        bool          addEffect     = false;            // decide whether to add this effect.
                        Vector3       localPosition = Vector3.forward * (bnd.center.z + bnd.size.z * 0.5f);
                        Quaternion    localRot      = Quaternion.identity;
                        Vector3       localScale    = Vector3.one;
                        UpgradeEffect ue            = u.GetComponent <UpgradeEffect>();
                        // ignore this object if no UpgradeEffect component attached on.
                        if (ue != null)
                        {
                            addEffect = true;
                            // for Shadow Effect, renderer of weapon is needed
                            if (ue is UpgradeShadowEffect)
                            {
                                addEffect = (renderers.Length > 0);
                                if (renderers.Length > 0)
                                {
                                    UpgradeShadowEffect use = ue as UpgradeShadowEffect;
                                    use._reference = renderers[0];
                                }
                            }
                        }
                        // if effect is allowed to add, hang it under weapon.
                        if (addEffect)
                        {
                            u.transform.parent        = inst.transform;
                            u.transform.localPosition = localPosition;
                            u.transform.localRotation = localRot;
                            u.transform.localScale    = localScale;
                        }
                        // otherwise destroy this temprary object.
                        else
                        {
                            GameObject.DestroyImmediate(u);
                        }
                    }
                }
            }
            // set material and layer for renderable objects.
            foreach (Renderer r in renderers)
            {
                if (r.gameObject.tag == "Untagged")
                {
                    r.sharedMaterial   = mat;
                    r.gameObject.layer = LayerMask.NameToLayer("CHARACTER");
                }
            }
            PrefabUtility.CreatePrefab(path.ToLower().Replace(".fbx", ".prefab"), inst);
            DestroyImmediate(inst);
        }
    }