void SpawnAmmoParticleObj()
    {
                #if USE_SPHERE_HIT
        GameObject objParticle = null;
        GameObject hitObj      = CheckPlayerAmmoOverlapSphereHit();
        if (hitObj == null)
        {
            switch (AmmoType)
            {
            case PlayerAmmoType.PuTongAmmo:
                break;

            default:
                objParticle = AmmoExplode;
                break;
            }
        }
        else
        {
            string tagHitObj = hitObj.tag;
            switch (AmmoType)
            {
            case PlayerAmmoType.PuTongAmmo:
                XKAmmoParticleCtrl ammoParticleScript = hitObj.GetComponent <XKAmmoParticleCtrl>();
                if (ammoParticleScript != null && ammoParticleScript.PuTongAmmoLZ != null)
                {
                    objParticle = ammoParticleScript.PuTongAmmoLZ;
                }
                else
                {
                    switch (tagHitObj)
                    {
                    case "metal":
                        objParticle = MetalParticle;
                        break;

                    case "concrete":
                        objParticle = ConcreteParticle;
                        break;

                    case "dirt":
                        objParticle = DirtParticle;
                        break;

                    case "wood":
                        objParticle = WoodParticle;
                        break;

                    case "water":
                        objParticle = WaterParticle;
                        break;

                    case "sand":
                        objParticle = SandParticle;
                        break;

                    case "glass":
                        objParticle = GlassParticle;
                        break;

                    default:
                        objParticle = AmmoExplode;
                        break;
                    }
                }
                break;

            default:
                switch (tagHitObj)
                {
                case "dirt":
                    objParticle = DirtParticle;
                    break;

                case "water":
                    objParticle = WaterParticle;
                    break;

                default:
                    objParticle = AmmoExplode;
                    break;
                }
                break;
            }
        }

        if (objParticle == null)
        {
            return;
        }

        GameObject obj  = (GameObject)Instantiate(objParticle, AmmoTran.position, AmmoTran.rotation);
        Transform  tran = obj.transform;
        tran.parent = XkGameCtrl.PlayerAmmoArray;
        XkGameCtrl.CheckObjDestroyThisTimed(obj);
                #else
        GameObject objParticle = null;
        GameObject obj         = null;
        Transform  tran        = null;
        Vector3    hitPos      = transform.position;

        RaycastHit hit;
        Vector3    forwardVal = Vector3.Normalize(AmmoEndPos - AmmoStartPos);
        if (AmmoType == PlayerAmmoType.PuTongAmmo)
        {
            float disVal = Vector3.Distance(AmmoEndPos, AmmoStartPos) + 10f;
            Physics.Raycast(AmmoStartPos, forwardVal, out hit, disVal, NpcAmmoHitLayer);
            if (hit.collider != null)
            {
                hitPos = hit.point;
                XKAmmoParticleCtrl ammoParticleScript = hit.collider.GetComponent <XKAmmoParticleCtrl>();
                if (ammoParticleScript != null && ammoParticleScript.PuTongAmmoLZ != null)
                {
                    objParticle = ammoParticleScript.PuTongAmmoLZ;
                }
                else
                {
                    string tagHitObj = hit.collider.tag;
                    switch (tagHitObj)
                    {
                    case "metal":
                        if (MetalParticle != null)
                        {
                            objParticle = MetalParticle;
                        }
                        break;

                    case "concrete":
                        if (ConcreteParticle != null)
                        {
                            objParticle = ConcreteParticle;
                        }
                        break;

                    case "dirt":
                        if (DirtParticle != null)
                        {
                            objParticle = DirtParticle;
                        }
                        break;

                    case "wood":
                        if (WoodParticle != null)
                        {
                            objParticle = WoodParticle;
                        }
                        break;

                    case "water":
                        if (WaterParticle != null)
                        {
                            objParticle = WaterParticle;
                        }
                        break;

                    case "sand":
                        if (SandParticle != null)
                        {
                            objParticle = SandParticle;
                        }
                        break;

                    case "glass":
                        if (GlassParticle != null)
                        {
                            objParticle = GlassParticle;
                        }
                        break;
                    }

                    if (objParticle == null)
                    {
                        objParticle = AmmoExplode;
                    }
                }
            }
            else
            {
                objParticle = AmmoExplode;
            }
        }
        else
        {
            float disVal = Vector3.Distance(AmmoEndPos, AmmoStartPos) + 10f;
            Physics.Raycast(AmmoStartPos, forwardVal, out hit, disVal, NpcAmmoHitLayer);
            if (hit.collider != null)
            {
                hitPos = hit.point;
                string tagHitObj = hit.collider.tag;
                switch (tagHitObj)
                {
                case "dirt":
                    if (DirtParticle != null)
                    {
                        objParticle = DirtParticle;
                    }
                    break;
                }

                if (objParticle == null)
                {
                    objParticle = AmmoExplode;
                }
            }
            else
            {
                objParticle = AmmoExplode;
            }
        }

        if (objParticle == null)
        {
            return;
        }

        if (AmmoType == PlayerAmmoType.DaoDanAmmo)
        {
            Vector3 AmmoPos = transform.position - (transform.forward * 3f);
            Physics.Raycast(AmmoPos, forwardVal, out hit, 13f, XkGameCtrl.GetInstance().LandLayer);
            if (hit.collider != null)
            {
                hitPos = hit.point;
                Vector3    normalVal = hit.normal;
                Quaternion rotVal    = Quaternion.LookRotation(normalVal);
                obj = (GameObject)Instantiate(objParticle, hitPos, rotVal);
                obj.transform.up = normalVal;
            }
            else
            {
                obj = (GameObject)Instantiate(objParticle, hitPos, transform.rotation);
            }
        }
        else
        {
            obj = (GameObject)Instantiate(objParticle, hitPos, transform.rotation);
        }

        tran        = obj.transform;
        tran.parent = XkGameCtrl.NpcAmmoArray;

        XkAmmoTieHuaCtrl tieHuaScript = obj.GetComponent <XkAmmoTieHuaCtrl>();
        if (tieHuaScript != null && tieHuaScript.TieHuaTran != null)
        {
            Transform tieHuaTran = tieHuaScript.TieHuaTran;
            Vector3   AmmoPos    = transform.position - (transform.forward * 3f);
            Physics.Raycast(AmmoPos, forwardVal, out hit, 13f, XkGameCtrl.GetInstance().PlayerAmmoHitLayer);
            if (hit.collider != null)
            {
                tieHuaTran.up = hit.normal;
            }
        }
                #endif
    }
Ejemplo n.º 2
0
    void SpawnAmmoParticleObj()
    {
        GameObject objParticle = null;
        GameObject obj         = null;
        Transform  tran        = null;
        Vector3    hitPos      = transform.position;

        RaycastHit hit;

        if (!IsHandleRpc)
        {
            AmmoEndPos   = transform.position;
            AmmoStartPos = transform.position - transform.forward * 3f;
            Physics.Raycast(AmmoStartPos, transform.forward, out hit, 1000f, PlayerAmmoHitLayer);
            if (hit.collider != null)
            {
                AmmoEndPos = hit.point;
            }
        }

        Vector3 forwardVal = Vector3.Normalize(AmmoEndPos - AmmoStartPos);

        if (AmmoType == PlayerAmmoType.PuTongAmmo)
        {
//			float disVal = Vector3.Distance(AmmoEndPos, AmmoStartPos) + 10f;
//			Physics.Raycast(AmmoStartPos, forwardVal, out hit, disVal, PlayerAmmoHitLayer);

            Vector3 startPos = Vector3.zero;
            Vector3 backVal  = -10f * transform.forward;
            if (GameTypeCtrl.IsTankVRStatic)
            {
                startPos = transform.position + backVal;
            }
            else
            {
                float   disAmmoOffset = AmmoSanSheDis;
                float   randKay       = Random.Range(0, 100) % 2 == 0 ? -1 : 1;
                Vector3 upVal         = randKay * Random.Range(0f, disAmmoOffset) * transform.up;
                randKay = Random.Range(0, 100) % 2 == 0 ? -1 : 1;
                Vector3 rightVal = randKay * Random.Range(0f, disAmmoOffset) * transform.right;
                startPos = transform.position + upVal + rightVal + backVal;
            }

            Physics.Raycast(startPos, transform.forward, out hit, 20f, PlayerAmmoHitLayer);
            if (hit.collider != null)
            {
                hitPos = hit.point;
                XKAmmoParticleCtrl ammoParticleScript = hit.collider.GetComponent <XKAmmoParticleCtrl>();
                if (ammoParticleScript != null && ammoParticleScript.PuTongAmmoLZ != null)
                {
                    objParticle = ammoParticleScript.PuTongAmmoLZ;
                }
                else
                {
                    string tagHitObj = hit.collider.tag;
                    switch (tagHitObj)
                    {
                    case "metal":
                        if (MetalParticle != null)
                        {
                            objParticle = MetalParticle;
                        }
                        break;

                    case "concrete":
                        if (ConcreteParticle != null)
                        {
                            objParticle = ConcreteParticle;
                        }
                        break;

                    case "dirt":
                        if (DirtParticle != null)
                        {
                            objParticle = DirtParticle;
                        }
                        break;

                    case "wood":
                        if (WoodParticle != null)
                        {
                            objParticle = WoodParticle;
                        }
                        break;

                    case "water":
                        if (WaterParticle != null)
                        {
                            objParticle = WaterParticle;
                        }
                        break;

                    case "sand":
                        if (SandParticle != null)
                        {
                            objParticle = SandParticle;
                        }
                        break;

                    case "glass":
                        if (GlassParticle != null)
                        {
                            objParticle = GlassParticle;
                        }
                        break;
                    }

                    if (objParticle == null)
                    {
                        objParticle = AmmoExplode;
                    }
                }

                if (IsHandleRpc &&
                    !IsDonotHurtNpc &&
                    Network.peerType != NetworkPeerType.Server &&
                    AmmoType == PlayerAmmoType.PuTongAmmo)
                {
                    XKNpcHealthCtrl healthScript = hit.collider.GetComponent <XKNpcHealthCtrl>();
                    if (healthScript != null)
                    {
                        if (HitNpcObj == null || HitNpcObj != hit.collider.gameObject)
                        {
                            //Debug.Log("playerAmmo hit npc, npc is "+hit.collider.name);
                            healthScript.OnDamageNpc(AmmoType, PlayerState);
                        }
                    }
                }
            }
            else
            {
                objParticle = AmmoExplode;
            }
        }
        else
        {
            float disVal = Vector3.Distance(AmmoEndPos, AmmoStartPos) + 10f;
            Physics.Raycast(AmmoStartPos, forwardVal, out hit, disVal, PlayerAmmoHitLayer);
            if (hit.collider != null)
            {
//				if (AmmoType == PlayerAmmoType.GaoBaoAmmo) {
//					Debug.Log("hit.collider "+hit.collider.name);
//				}
                hitPos = hit.point;
                string tagHitObj = hit.collider.tag;
                switch (tagHitObj)
                {
                case "dirt":
                    if (DirtParticle != null)
                    {
                        objParticle = DirtParticle;
                    }
                    break;

                case "water":
                    if (WaterParticle != null)
                    {
                        objParticle = WaterParticle;
                    }
                    break;
                }

                if (objParticle == null)
                {
                    objParticle = AmmoExplode;
                }
            }
            else
            {
                objParticle = AmmoExplode;
            }
        }

        if (objParticle == null)
        {
            return;
        }

        if (AmmoType == PlayerAmmoType.DaoDanAmmo)
        {
            Vector3 AmmoPos = transform.position - (transform.forward * 3f);
            Physics.Raycast(AmmoPos, forwardVal, out hit, 13f, XkGameCtrl.GetInstance().LandLayer);
            if (hit.collider != null)
            {
                hitPos = hit.point;
                Vector3    normalVal = hit.normal;
                Quaternion rotVal    = Quaternion.LookRotation(normalVal);
                obj = SpawnParticleCom.SpawnParticleObject(objParticle, hitPos, rotVal);
                obj.transform.up = normalVal;
            }
            else
            {
                obj = SpawnParticleCom.SpawnParticleObject(objParticle, hitPos, transform.rotation);
            }
        }
        else
        {
            obj = SpawnParticleCom.SpawnParticleObject(objParticle, hitPos, transform.rotation);
        }
        tran        = obj.transform;
        tran.parent = XkGameCtrl.PlayerAmmoArray;
        XkGameCtrl.CheckObjDestroyThisTimed(obj);

        XkAmmoTieHuaCtrl tieHuaScript = obj.GetComponent <XkAmmoTieHuaCtrl>();

        if (tieHuaScript != null && tieHuaScript.TieHuaTran != null)
        {
            Transform tieHuaTran = tieHuaScript.TieHuaTran;
            Vector3   AmmoPos    = transform.position - (transform.forward * 3f);
            Physics.Raycast(AmmoPos, forwardVal, out hit, 13f, XkGameCtrl.GetInstance().PlayerAmmoHitLayer);
            if (hit.collider != null)
            {
                tieHuaTran.up = hit.normal;
            }
        }
    }
Ejemplo n.º 3
0
    //static int TestCount = 0;
    void SpawnAmmoParticleObj(XKNpcHealthCtrl healthScript = null)
    {
        if (AmmoType != PlayerAmmoType.ChuanTouAmmo)
        {
            //不是穿甲弹.
            if (IsCreatAmmoParticle == true)
            {
                //已经创建过爆炸粒子.
                return;
            }
            IsCreatAmmoParticle = true;
        }

        //if (AmmoType == PlayerAmmoType.DaoDanAmmo)
        //{
        //    TestCount++;
        //    SSDebug.LogWarning("SpawnAmmoParticleObj -> healthScript ============= " + healthScript
        //        + ", TestCount == " + TestCount
        //        + ", time == " + Time.time.ToString("f3"));
        //}

        //if (TestCount >= 100)
        //{
        //    TestCount = 0;
        //}

#if USE_SPHERE_HIT
        GameObject objParticle = null;
        GameObject hitObj      = CheckPlayerAmmoOverlapSphereHit(1);
        if (hitObj == null)
        {
            switch (AmmoType)
            {
            case PlayerAmmoType.PuTongAmmo:
                break;

            default:
                objParticle = AmmoExplode;
                break;
            }
        }
        else
        {
            string tagHitObj = hitObj.tag;
            switch (AmmoType)
            {
            case PlayerAmmoType.PuTongAmmo:
                XKAmmoParticleCtrl ammoParticleScript = hitObj.GetComponent <XKAmmoParticleCtrl>();
                if (ammoParticleScript != null && ammoParticleScript.PuTongAmmoLZ != null)
                {
                    objParticle = ammoParticleScript.PuTongAmmoLZ;
                }
                else
                {
                    switch (tagHitObj)
                    {
                    case "metal":
                        objParticle = MetalParticle;
                        break;

                    case "concrete":
                        objParticle = ConcreteParticle;
                        break;

                    case "dirt":
                        objParticle = DirtParticle;
                        break;

                    case "wood":
                        objParticle = WoodParticle;
                        break;

                    case "water":
                        objParticle = WaterParticle;
                        break;

                    case "sand":
                        objParticle = SandParticle;
                        break;

                    case "glass":
                        objParticle = GlassParticle;
                        break;

                    default:
                        objParticle = AmmoExplode;
                        break;
                    }
                }
                break;

            default:
                switch (tagHitObj)
                {
                case "dirt":
                    objParticle = DirtParticle;
                    break;

                case "water":
                    objParticle = WaterParticle;
                    break;

                default:
                    objParticle = AmmoExplode;
                    break;
                }
                break;
            }
        }

        if (objParticle == null)
        {
            return;
        }

        Vector3    pos = AmmoTran.position;
        Quaternion rot = AmmoTran.rotation;
        if (AmmoType == PlayerAmmoType.ChongJiBoAmmo)
        {
            if (healthScript != null)
            {
                //获取距离冲击波子弹最近的爆炸产生点.
                Transform tr = healthScript.GetAmmoLiZiMinDisSpawnPoint(transform);
                if (tr != null)
                {
                    //冲击波子弹.
                    pos = tr.position;
                    rot = tr.rotation;
                }
            }
            else
            {
                //冲击波子弹没有击中npc时不产生自爆粒子.
                return;
            }
        }
        GameObject obj  = (GameObject)Instantiate(objParticle, pos, rot);
        Transform  tran = obj.transform;
        tran.parent = XkGameCtrl.PlayerAmmoArray;
        XkGameCtrl.CheckObjDestroyThisTimed(obj);

        SSPlayerAmmoBaoJi baoJiAmmo = obj.GetComponent <SSPlayerAmmoBaoJi>();
        if (baoJiAmmo != null)
        {
            bool isDisplayBaoJi = false;
            if (healthScript != null)
            {
                if (healthScript.GetIsDaiJinQuanNpc() == true)
                {
                    //代金券npc.
                    isDisplayBaoJi = true;
                }

                //if (XkGameCtrl.GetInstance().m_SSDebugBaoJi != null)
                //{
                //    //测试爆击代金券npc.
                //    XkGameCtrl.GetInstance().m_SSDebugBaoJi.IsHitDaiJinQuanNpc = healthScript.GetIsDaiJinQuanNpc();
                //}
            }
            //else
            //{
            //    if (XkGameCtrl.GetInstance().m_SSDebugBaoJi != null)
            //    {
            //        //测试爆击代金券npc.
            //        XkGameCtrl.GetInstance().m_SSDebugBaoJi.IsHitDaiJinQuanNpc = false;
            //    }
            //}

            if (isDisplayBaoJi == true)
            {
                //初始化子弹爆炸粒子上的暴击效果.
                baoJiAmmo.Init(PlayerState);
            }
            else
            {
                //隐藏子弹爆炸粒子上的暴击效果.
                baoJiAmmo.HiddenBaoJi();
            }
        }
#else
        GameObject objParticle = null;
        GameObject obj         = null;
        Transform  tran        = null;
        Vector3    hitPos      = transform.position;
        RaycastHit hit;
        Vector3    forwardVal = Vector3.Normalize(AmmoEndPos - AmmoStartPos);
        if (AmmoType == PlayerAmmoType.PuTongAmmo)
        {
            float disVal = Vector3.Distance(AmmoEndPos, AmmoStartPos) + 10f;
            Physics.Raycast(AmmoStartPos, forwardVal, out hit, disVal, PlayerAmmoHitLayer);
            if (hit.collider != null)
            {
                XKAmmoParticleCtrl ammoParticleScript = hit.collider.GetComponent <XKAmmoParticleCtrl>();
                if (ammoParticleScript != null && ammoParticleScript.PuTongAmmoLZ != null)
                {
                    objParticle = ammoParticleScript.PuTongAmmoLZ;
                }
                else
                {
                    string tagHitObj = hit.collider.tag;
                    switch (tagHitObj)
                    {
                    case "metal":
                        if (MetalParticle != null)
                        {
                            objParticle = MetalParticle;
                        }
                        break;

                    case "concrete":
                        if (ConcreteParticle != null)
                        {
                            objParticle = ConcreteParticle;
                        }
                        break;

                    case "dirt":
                        if (DirtParticle != null)
                        {
                            objParticle = DirtParticle;
                        }
                        break;

                    case "wood":
                        if (WoodParticle != null)
                        {
                            objParticle = WoodParticle;
                        }
                        break;

                    case "water":
                        if (WaterParticle != null)
                        {
                            objParticle = WaterParticle;
                        }
                        break;

                    case "sand":
                        if (SandParticle != null)
                        {
                            objParticle = SandParticle;
                        }
                        break;

                    case "glass":
                        if (GlassParticle != null)
                        {
                            objParticle = GlassParticle;
                        }
                        break;
                    }

                    if (objParticle == null)
                    {
                        objParticle = AmmoExplode;
                    }
                }
            }
            else
            {
                objParticle = AmmoExplode;
            }
        }
        else
        {
            float disVal = Vector3.Distance(AmmoEndPos, AmmoStartPos) + 10f;
            Physics.Raycast(AmmoStartPos, forwardVal, out hit, disVal, PlayerAmmoHitLayer);
            if (hit.collider != null)
            {
                string tagHitObj = hit.collider.tag;
                switch (tagHitObj)
                {
                case "dirt":
                    if (DirtParticle != null)
                    {
                        objParticle = DirtParticle;
                    }
                    break;

                case "water":
                    if (WaterParticle != null)
                    {
                        objParticle = WaterParticle;
                    }
                    break;
                }

                if (objParticle == null)
                {
                    objParticle = AmmoExplode;
                }
            }
            else
            {
                objParticle = AmmoExplode;
            }
        }

        if (objParticle == null)
        {
            return;
        }

        hitPos = explodePos;
        switch (AmmoType)
        {
        case PlayerAmmoType.DaoDanAmmo:
            Vector3 AmmoPos = transform.position - (transform.forward * 3f);
            Physics.Raycast(AmmoPos, forwardVal, out hit, 13f, XkGameCtrl.GetInstance().LandLayer);
            if (hit.collider != null)
            {
                Vector3    normalVal = hit.normal;
                Quaternion rotVal    = Quaternion.LookRotation(normalVal);
                obj = (GameObject)Instantiate(objParticle, hitPos, rotVal);
                obj.transform.up = normalVal;
            }
            else
            {
                obj = (GameObject)Instantiate(objParticle, hitPos, transform.rotation);
            }
            break;

        case PlayerAmmoType.ChuanTouAmmo:
            obj = (GameObject)Instantiate(objParticle, explodePos, transform.rotation);
            break;

        default:
            obj = (GameObject)Instantiate(objParticle, hitPos, transform.rotation);
            break;
        }
        tran        = obj.transform;
        tran.parent = XkGameCtrl.PlayerAmmoArray;
        XkGameCtrl.CheckObjDestroyThisTimed(obj);

        XkAmmoTieHuaCtrl tieHuaScript = obj.GetComponent <XkAmmoTieHuaCtrl>();
        if (tieHuaScript != null && tieHuaScript.TieHuaTran != null)
        {
            Transform tieHuaTran = tieHuaScript.TieHuaTran;
            Vector3   AmmoPos    = transform.position - (transform.forward * 3f);
            Physics.Raycast(AmmoPos, forwardVal, out hit, 13f, XkGameCtrl.GetInstance().PlayerAmmoHitLayer);
            if (hit.collider != null)
            {
                tieHuaTran.up = hit.normal;
            }
        }
#endif
    }