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 }
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; } } }
//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 }