public static TankInitSystem InitTankPrefabs(VehicleData vehicleData, bool isPreviewMode)
    {
        #region Collision Detect
        if (vehicleData.modelData.MainModel.GetComponentsInChildren <BoxCollider>().Length == 0)
        {
            if (EditorUtility.DisplayDialog("Error", "Collision should be set.We will redirct you to it.", "OK,l will set it now!", "No,l will choose another one"))
            {
                EditorGUIUtility.PingObject(vehicleData.modelData.MainModel.GetInstanceID());
                OpenEditorScene();

                GameObject EditColliderInstance = Instantiate <GameObject>(vehicleData.modelData.MainModel);
                EditColliderInstance.name = vehicleData.modelData.MainModel.name;

                string TempPath       = System.IO.Path.GetDirectoryName(AssetDatabase.GetAssetPath(vehicleData.modelData.MainModel.GetInstanceID()));
                string PrefabStoreDir = System.IO.Directory.CreateDirectory(string.Format(TempPath + "/Collisions_{0}", vehicleData.modelData.MainModel.name)).FullName;

                AssetDatabase.Refresh();
                return(null);
                //PrefabUtility.CreatePrefab (string.Format (PrefabStoreDir + "/{0}.prefab", vehicleData.modelData.MainModel.name),EditColliderInstance);
            }
            else
            {
                return(null);
            }
        }
        #endregion
        GameObject TankPrefabs  = new GameObject();
        GameObject InstanceMesh = Instantiate(vehicleData.modelData.MainModel);

        try
        {
            #region Init
            InstanceMesh.name = vehicleData.vehicleTextData.AssetName;
            #endregion

            TankPrefabs.name = vehicleData.vehicleTextData.AssetName + "_Pre";

            InstanceMesh.transform.parent        = TankPrefabs.transform;
            InstanceMesh.transform.localPosition = vehicleData.cacheData.StartPoint;

            GameObject VehicleDynamics = new GameObject("VehicleDynamics");
            VehicleDynamics.transform.parent = InstanceMesh.transform;

            Transform RightWheel, LeftWheel, RightUpperWheels, LeftUpperWheels, Turret, Gun, GunDym;
            #region Find Dumps
            RightWheel = InstanceMesh.transform.Find("RightWheel");
            LeftWheel  = InstanceMesh.transform.Find("LeftWheel");
            Turret     = InstanceMesh.transform.Find("Turret");
            Gun        = Turret.transform.Find("Gun");
            GunDym     = Gun.GetChild(0);


            RightUpperWheels = InstanceMesh.transform.Find("RightUpperWheel");
            LeftUpperWheels  = InstanceMesh.transform.Find("LeftUpperWheel");
            #endregion
            RightWheel.parent       = VehicleDynamics.transform;
            LeftWheel.parent        = VehicleDynamics.transform;
            LeftUpperWheels.parent  = VehicleDynamics.transform;
            RightUpperWheels.parent = VehicleDynamics.transform;

            #region FireSystem
            VehicleComponentsReferenceManager referenceManager = InstanceMesh.AddComponent <VehicleComponentsReferenceManager>();

            var mutiTurretTransList = new List <FireSystemTransform>();

            //多炮塔配置
            foreach (var multiTurret in vehicleData.vehicleTextData.MultiFireSystemData)
            {
                var mTurret = InstanceMesh.transform.Find(multiTurret.turretPath);
                var mGun    = mTurret.Find(multiTurret.gunPath);
                var mDym    = mGun.Find(multiTurret.dymPath);

                var turretParent = mTurret.parent;

                CreateWrapper(mDym, true);
                CreateWrapper(mGun, true);
                CreateWrapper(mTurret, true);

                mDym.parent.SetParent(mGun.parent);
                mGun.parent.SetParent(mTurret.parent);
                mTurret.parent.SetParent(turretParent);

                var gunFollowerTrans = new GameObject("GunFollowerTrans").transform;
                gunFollowerTrans.SetParent(mGun.parent);
                gunFollowerTrans.localPosition = multiTurret.gunFollowerOffSet;


                var turretFollowerTrans = new GameObject("TurretFollowerTrans").transform;
                turretFollowerTrans.SetParent(mGun.parent);
                turretFollowerTrans.localPosition = multiTurret.turretFollowerOffSet;



                //多炮塔毕竟少数
                var mffpoint = new GameObject("FFPoint").transform;
                mffpoint.SetParent(mDym.parent);
                mffpoint.rotation = mDym.parent.rotation;
                mffpoint.position = mDym.parent.position + mDym.parent.forward * multiTurret.ffPointOffSet;

                var meffectStart = new GameObject("EffectStart").transform;
                meffectStart.SetParent(mDym.parent);
                meffectStart.rotation = mDym.parent.rotation;
                meffectStart.position = mDym.parent.position + mDym.parent.forward * multiTurret.effectStartOffSet;

                //但是 我们依然设置 Icon 方便编辑
                IconManager.SetIcon(mffpoint.gameObject, IconManager.LabelIcon.Red);
                IconManager.SetIcon(meffectStart.gameObject, IconManager.LabelIcon.Red);

                mutiTurretTransList.Add(
                    new FireSystemTransform
                {
                    turret           = mTurret.parent,
                    gun              = mGun.parent,
                    dym              = mDym.parent,
                    ffPoint          = mffpoint,
                    fireEffectPoint  = meffectStart,
                    gunFollowerTrans = gunFollowerTrans,
                });
            }
            referenceManager.mutiTurretTrans = mutiTurretTransList;

            GameObject TurretTransform = new GameObject("TurretTransform");
            GameObject GunTransform    = new GameObject("GunTransform");
            GameObject GunDymTransform = new GameObject("GunDym");


            TurretTransform.transform.SetParent(InstanceMesh.transform);
            TurretTransform.transform.position = Turret.transform.position;

            GunTransform.transform.position = Gun.transform.position;
            Turret.parent = TurretTransform.transform;

            Gun.parent = GunTransform.transform;
            GunTransform.transform.SetParent(TurretTransform.transform);

            GunDymTransform.transform.position = GunDym.transform.position;
            GunDymTransform.transform.SetParent(GunTransform.transform);
            GunDym.SetParent(GunDymTransform.transform);
            #endregion


            AddDumpNode("FFPoint", GunTransform.transform, vehicleData, true, referenceManager);
            AddDumpNode("EffectStart", GunTransform.transform, vehicleData, true, referenceManager);
            AddDumpNode("FireForceFeedbackPoint", GunTransform.transform, vehicleData, true, referenceManager);
            AddDumpNode("EngineSmoke", InstanceMesh.transform, vehicleData, true, referenceManager);
            AddDumpNode("EngineSound", InstanceMesh.transform, vehicleData, true, referenceManager);
            AddDumpNode("MainCameraFollowTarget", InstanceMesh.transform, vehicleData, true, referenceManager);
            AddDumpNode("MainCameraGunner", GunTransform.transform, vehicleData, true, referenceManager);
            AddDumpNode("CenterOfGravity", InstanceMesh.transform, vehicleData, true, referenceManager);
            AddDumpNode("BotPoint", InstanceMesh.transform, vehicleData, true, referenceManager);

            referenceManager.LeftTrack  = InstanceMesh.transform.Find("LeftTrack").gameObject;
            referenceManager.RightTrack = InstanceMesh.transform.Find("RightTrack").gameObject;

            referenceManager.LeftWheels  = ResortWheelTrans(GetChilds(LeftWheel));
            referenceManager.RightWheels = ResortWheelTrans(GetChilds(RightWheel));

            referenceManager.LeftUpperWheels  = ResortWheelTrans(GetChilds(LeftUpperWheels));
            referenceManager.RightUpperWheels = ResortWheelTrans(GetChilds(RightUpperWheels));

            GameObject HitBoxInstance = Instantiate <GameObject>(vehicleData.modelData.HitBox.HitBoxPrefab);
            HitBoxInstance.transform.position += vehicleData.cacheData.StartPoint;

            referenceManager.MainHitBox   = HitBoxInstance.transform.Find("Main").gameObject;
            referenceManager.TurretHitBox = HitBoxInstance.transform.Find("Turret").gameObject;
            referenceManager.GunHitBox    = HitBoxInstance.transform.Find("Gun").gameObject;
            referenceManager.DymHitBox    = HitBoxInstance.transform.Find("Dym").gameObject;

            HitBoxInstance.transform.Find("Main").name = "MainHitBox";
            HitBoxInstance.transform.Find("MainHitBox").SetParent(InstanceMesh.transform);

            HitBoxInstance.transform.Find("Turret").name = "TurretHitBox";
            HitBoxInstance.transform.Find("TurretHitBox").SetParent(TurretTransform.transform);

            HitBoxInstance.transform.Find("Gun").name = "GunHitBox";
            HitBoxInstance.transform.Find("GunHitBox").SetParent(GunTransform.transform);

            HitBoxInstance.transform.Find("Dym").name = "DymHitBox";
            HitBoxInstance.transform.Find("DymHitBox").SetParent(GunDymTransform.transform);

            DestroyImmediate(HitBoxInstance);



            new GameObject("MainCameraTarget").transform.SetParent(TurretTransform.transform);

            TankInitSystem initySystem = TankPrefabs.AddComponent <TankInitSystem>();
            initySystem.vehicleTextData = vehicleData.vehicleTextData;

            #region Vehicle Physic
            var vehiclePhysic = InstanceMesh.AddComponent <Rigidbody>();
            vehiclePhysic.mass             = vehicleData.vehicleTextData.PTCParameter.Mass;
            vehiclePhysic.drag             = 0.1f;
            vehiclePhysic.angularDrag      = 2.5f;
            vehiclePhysic.useGravity       = true;
            referenceManager.VehiclePhysic = vehiclePhysic;
            #endregion

            referenceManager.VehicleDynamics = VehicleDynamics;

            referenceManager.TurretGameObject = TurretTransform;
            referenceManager.GunGameObject    = GunTransform;
            referenceManager.GunDymGameObject = GunDymTransform;

            if (!isPreviewMode)
            {
                CreateWrapper(referenceManager.MainCameraFollowTarget.transform);
                CreateWrapper(referenceManager.MainCameraGunner.transform);
            }


            return(initySystem);
        }
        catch (System.Exception exception)
        {
            EditorUtility.DisplayDialog("Exception", exception.Message + "\n" + exception.StackTrace, "OK");
            DestroyImmediate(TankPrefabs);
            throw exception;
        }
    }
예제 #2
0
    TankInitSystem InitTankPrefabs()
    {
        #region Collision Detect
        if (vehicleData.modelData.MainModel.GetComponentsInChildren <BoxCollider>().Length == 0)
        {
            if (EditorUtility.DisplayDialog("Error", "Collision should be set.We will redirct you to it.", "OK,l will set it now!", "No,l will choose another one"))
            {
                EditorGUIUtility.PingObject(vehicleData.modelData.MainModel.GetInstanceID());
                OpenEditorScene();

                GameObject EditColliderInstance = Instantiate <GameObject>(vehicleData.modelData.MainModel);
                EditColliderInstance.name = vehicleData.modelData.MainModel.name;

                string TempPath       = System.IO.Path.GetDirectoryName(AssetDatabase.GetAssetPath(vehicleData.modelData.MainModel.GetInstanceID()));
                string PrefabStoreDir = System.IO.Directory.CreateDirectory(string.Format(TempPath + "/Collisions_{0}", vehicleData.modelData.MainModel.name)).FullName;

                AssetDatabase.Refresh();
                return(null);
                //PrefabUtility.CreatePrefab (string.Format (PrefabStoreDir + "/{0}.prefab", vehicleData.modelData.MainModel.name),EditColliderInstance);
            }
            else
            {
                return(null);
            }
        }
        #endregion
        GameObject TankPrefabs  = new GameObject();
        GameObject InstanceMesh = Instantiate(vehicleData.modelData.MainModel);

        try {
            #region Init
            InstanceMesh.name = vehicleData.modelData.MainModel.name;
            #endregion

            TankPrefabs.name = InstanceMesh.name + "_Pre";

            InstanceMesh.transform.parent = TankPrefabs.transform;

            GameObject TankTransform = new GameObject("TankTransform");
            TankTransform.transform.parent = InstanceMesh.transform;

            Transform RightWheel, LeftWheel, RightUpperWheels, LeftUpperWheels, Turret, Gun, GunDym;
            #region Find Dumps
            RightWheel = InstanceMesh.transform.Find("RightWheel");
            LeftWheel  = InstanceMesh.transform.Find("LeftWheel");
            Turret     = InstanceMesh.transform.Find("Turret");
            Gun        = Turret.transform.Find("Gun");
            GunDym     = Gun.GetChild(0);


            RightUpperWheels = InstanceMesh.transform.Find("RightUpperWheel");
            LeftUpperWheels  = InstanceMesh.transform.Find("LeftUpperWheel");
            #endregion
            RightWheel.parent       = TankTransform.transform;
            LeftWheel.parent        = TankTransform.transform;
            LeftUpperWheels.parent  = TankTransform.transform;
            RightUpperWheels.parent = TankTransform.transform;


            GameObject TurretTransform = new GameObject("TurretTransform");
            GameObject GunTransform    = new GameObject("GunTransform");
            GameObject GunDymTransform = new GameObject("GunDym");

            VehicleComponentsReferenceManager referenceManager = InstanceMesh.AddComponent <VehicleComponentsReferenceManager>();

            TurretTransform.transform.SetParent(InstanceMesh.transform);
            TurretTransform.transform.position = Turret.transform.position;

            GunTransform.transform.position = Gun.transform.position;
            Turret.parent = TurretTransform.transform;

            Gun.parent = GunTransform.transform;
            GunTransform.transform.SetParent(TurretTransform.transform);

            GunDymTransform.transform.position = GunDym.transform.position;
            GunDymTransform.transform.SetParent(GunTransform.transform);
            GunDym.SetParent(GunDymTransform.transform);

            #region Add fire animation
            Animator FireAnimator = GunDymTransform.AddComponent <Animator>();
            FireAnimator.runtimeAnimatorController = vehicleData.vehicleTextData.TFParameter.GymAnimation;
            #endregion

            AddDumpNode("FFPoint", GunTransform.transform, true, referenceManager);
            AddDumpNode("EffectStart", GunTransform.transform, true, referenceManager);
            AddDumpNode("FireForceFeedbackPoint", GunTransform.transform, true, referenceManager);
            AddDumpNode("EngineSmoke", InstanceMesh.transform, true, referenceManager);
            AddDumpNode("EngineSound", InstanceMesh.transform, true, referenceManager);
            AddDumpNode("MainCameraFollowTarget", InstanceMesh.transform, true, referenceManager);
            AddDumpNode("MainCameraGunner", GunTransform.transform, true, referenceManager);
            AddDumpNode("MachineGunFFPoint", TurretTransform.transform, true, referenceManager);
            AddDumpNode("CenterOfGravity", InstanceMesh.transform, true, referenceManager);

            referenceManager.LeftTrack  = InstanceMesh.transform.Find("LeftTrack").gameObject;
            referenceManager.RightTrack = InstanceMesh.transform.Find("RightTrack").gameObject;

            GameObject HitBoxInstance = Instantiate <GameObject>(vehicleData.modelData.HitBox.HitBoxPrefab);
            HitBoxInstance.transform.Find("Main").name = "MainHitBox";
            HitBoxInstance.transform.Find("MainHitBox").SetParent(InstanceMesh.transform);

            HitBoxInstance.transform.Find("Turret").name = "TurretHitBox";
            HitBoxInstance.transform.Find("TurretHitBox").SetParent(TurretTransform.transform);

            HitBoxInstance.transform.Find("Gun").name = "GunHitBox";
            HitBoxInstance.transform.Find("GunHitBox").SetParent(GunTransform.transform);

            HitBoxInstance.transform.Find("Dym").name = "DymHitBox";
            HitBoxInstance.transform.Find("DymHitBox").SetParent(GunDymTransform.transform);

            DestroyImmediate(HitBoxInstance);
            Restore(LeftWheel.GetComponentsInChildren <Transform>());
            Restore(RightWheel.GetComponentsInChildren <Transform>());

            Restore(LeftUpperWheels.GetComponentsInChildren <Transform>());
            Restore(RightUpperWheels.GetComponentsInChildren <Transform>());

            new GameObject("MainCameraTarget").transform.SetParent(TurretTransform.transform);

            TankInitSystem initySystem = TankPrefabs.AddComponent <TankInitSystem>();
            initySystem.PSParameter  = vehicleData.vehicleTextData.PSParameter;
            initySystem.TFParameter  = vehicleData.vehicleTextData.TFParameter;
            initySystem.MTParameter  = vehicleData.vehicleTextData.MTParameter;
            initySystem.PTCParameter = vehicleData.vehicleTextData.PTCParameter;

            return(initySystem);
        }
        catch (System.Exception exception) {
            EditorUtility.DisplayDialog("Exception", exception.Message + "\n" + exception.StackTrace, "OK");
            DestroyImmediate(TankPrefabs);
            throw exception;
            return(null);
        }
    }
예제 #3
0
    TankInitSystem InitTankPrefabs()
    {
        #region 碰撞检测
        if (vehicleData.modelData.MainModel.GetComponentsInChildren <BoxCollider> ().Length == 0)
        {
            if (EditorUtility.DisplayDialog("错误", "坦克模型必须设置完毕碰撞数据", "好的,立刻去设置", "重新选择资源"))
            {
                EditorGUIUtility.PingObject(vehicleData.modelData.MainModel.GetInstanceID());
                OpenEditorScene();

                GameObject EditColliderInstance = Instantiate <GameObject> (vehicleData.modelData.MainModel);
                EditColliderInstance.name = vehicleData.modelData.MainModel.name;

                string TempPath       = System.IO.Path.GetDirectoryName(AssetDatabase.GetAssetPath(vehicleData.modelData.MainModel.GetInstanceID()));
                string PrefabStoreDir = System.IO.Directory.CreateDirectory(string.Format(TempPath + "/Collisions_{0}", vehicleData.modelData.MainModel.name)).FullName;

                AssetDatabase.Refresh();
                //PrefabUtility.CreatePrefab (string.Format (PrefabStoreDir + "/{0}.prefab", vehicleData.modelData.MainModel.name),EditColliderInstance);
            }
            else
            {
                return(null);
            }
        }
        #endregion

        #region 初始化 坦克物体变量
        GameObject TankPrefabs  = new GameObject();
        GameObject InstanceMesh = Instantiate(vehicleData.modelData.MainModel);
        InstanceMesh.name = vehicleData.modelData.MainModel.name;
        #endregion

        TankPrefabs.name = InstanceMesh.name + "_Pre";

        InstanceMesh.transform.parent = TankPrefabs.transform;

        GameObject TankTransform = new GameObject("TankTransform");
        TankTransform.transform.parent = InstanceMesh.transform;

        Transform RightWheel, LeftWheel, RightUpperWheels, LeftUpperWheels, Turret, Gun, GunDym;
        #region 在模型上寻找虚拟对象
        RightWheel = InstanceMesh.transform.Find("RightWheel");
        LeftWheel  = InstanceMesh.transform.Find("LeftWheel");
        Turret     = InstanceMesh.transform.Find("Turret");
        Gun        = Turret.transform.Find("Gun");
        GunDym     = Gun.GetChild(0);

        RightUpperWheels = InstanceMesh.transform.Find("RightUpperWheel");
        LeftUpperWheels  = InstanceMesh.transform.Find("LeftUpperWheel");
        #endregion
        RightWheel.parent       = TankTransform.transform;
        LeftWheel.parent        = TankTransform.transform;
        LeftUpperWheels.parent  = TankTransform.transform;
        RightUpperWheels.parent = TankTransform.transform;

        #region 实例化坦克的附加物体 坦克控制器 坦克脚本 坦克ui 坦克瞄准镜 主摄像机 坦克引擎声音 坦克引擎烟雾 死亡效果
        //EngineSmoke = new GameObject("EngineSmoke");
        //LeftTrackEffect = new GameObject("LeftTrackEffect");
        //RightTrackEffect=new GameObject("RightTrackEffect");
        #endregion
        GameObject TurretTransform = new GameObject("TurretTransform");
        GameObject GunTransform    = new GameObject("GunTransform");
        GameObject GunDymTransform = new GameObject("GunDym");

        VehicleComponentsReferenceManager referenceManager = InstanceMesh.AddComponent <VehicleComponentsReferenceManager>();

        //GameObject MainHitBox = new GameObject ("MainHitBox");
        //GameObject TurretHitBox = new GameObject ("TurretHitBox");


        TurretTransform.transform.SetParent(InstanceMesh.transform);
        TurretTransform.transform.position = Turret.transform.position;

        GunTransform.transform.position = Gun.transform.position;
        Turret.parent = TurretTransform.transform;

        Gun.parent = GunTransform.transform;
        GunTransform.transform.SetParent(TurretTransform.transform);

        GunDymTransform.transform.position = GunDym.transform.position;
        GunDymTransform.transform.SetParent(GunTransform.transform);
        GunDym.SetParent(GunDymTransform.transform);

        #region 发射动画
        Animator FireAnimator = GunDymTransform.AddComponent <Animator> ();
        FireAnimator.runtimeAnimatorController = vehicleData.vehicleTextData.TFParameter.GymAnimation;
        #endregion

        AddDumpNode("FFPoint", GunTransform.transform, true, referenceManager);
        AddDumpNode("EffectStart", GunTransform.transform, true, referenceManager);
        AddDumpNode("FireForceFeedbackPoint", InstanceMesh.transform, true, referenceManager);
        AddDumpNode("EngineSmoke", InstanceMesh.transform, true, referenceManager);
        AddDumpNode("EngineSound", InstanceMesh.transform, true, referenceManager);
        AddDumpNode("MainCameraFollowTarget", InstanceMesh.transform, true, referenceManager);
        AddDumpNode("MainCameraGunner", GunTransform.transform, true, referenceManager);
        AddDumpNode("MachineGunFFPoint", TurretTransform.transform, true, referenceManager);
        AddDumpNode("CenterOfGravity", InstanceMesh.transform, true, referenceManager);



        //MainHitBox.transform.parent = TankModel.transform;
        //TurretHitBox.transform.parent = TurretTransform.transform;

        //EngineSmoke.transform.parent = TankModel.transform;
        //EngineSmoke.tag = "EngineSmoke";



        //		GameObject LODMesh = new GameObject ("LODMesh");
        //		LODMesh.transform.SetParent (TankModel.transform);
        //		LODMesh.tag = "LODMesh";

        GameObject HitBoxInstance = Instantiate <GameObject> (vehicleData.modelData.HitBox.HitBoxPrefab);
        HitBoxInstance.transform.Find("Main").name = "MainHitBox";
        HitBoxInstance.transform.Find("MainHitBox").SetParent(InstanceMesh.transform);

        HitBoxInstance.transform.Find("Turret").name = "TurretHitBox";
        HitBoxInstance.transform.Find("TurretHitBox").SetParent(TurretTransform.transform);

        HitBoxInstance.transform.Find("Gun").name = "GunHitBox";
        HitBoxInstance.transform.Find("GunHitBox").SetParent(GunTransform.transform);

        HitBoxInstance.transform.Find("Dym").name = "DymHitBox";
        HitBoxInstance.transform.Find("DymHitBox").SetParent(GunDymTransform.transform);

        DestroyImmediate(HitBoxInstance);
        //HitBoxInstance.transform.Find("Dym").SetParent()
        Restore(LeftWheel.GetComponentsInChildren <Transform> ());
        Restore(RightWheel.GetComponentsInChildren <Transform> ());

        Restore(LeftUpperWheels.GetComponentsInChildren <Transform> ());
        Restore(RightUpperWheels.GetComponentsInChildren <Transform> ());

        new GameObject("MainCameraTarget").transform.SetParent(TurretTransform.transform);

        TankInitSystem initySystem = TankPrefabs.AddComponent <TankInitSystem>();
        initySystem.PSParameter  = vehicleData.vehicleTextData.PSParameter;
        initySystem.TFParameter  = vehicleData.vehicleTextData.TFParameter;
        initySystem.MTParameter  = vehicleData.vehicleTextData.MTParameter;
        initySystem.PTCParameter = vehicleData.vehicleTextData.PTCParameter;

        return(initySystem);
    }