void Add_Explosion_Force(Collider Temp_Target_Collider) { //yield return new WaitForSeconds ( 0.01f * Vector3.Distance ( This_Transform.position , Temp_Target_Collider.transform.position ) ) ; if (Temp_Target_Collider) { Vector3 Ray_Direction = (Temp_Target_Collider.transform.position - This_Transform.position).normalized; Ray Temp_Ray = new Ray(This_Transform.position, Ray_Direction); int layerMask = ~((1 << 10) + (1 << 2)); RaycastHit Temp_RaycastHit; if (Physics.Raycast(Temp_Ray, out Temp_RaycastHit, Explosion_Radius, layerMask)) { if (Temp_RaycastHit.collider == Temp_Target_Collider) { float Distance_Loss = Mathf.Pow((Explosion_Radius - Temp_RaycastHit.distance) / Explosion_Radius, 2); // Add force. Rigidbody Temp_Rigidbody = Temp_Target_Collider.GetComponent <Rigidbody>(); if (Temp_Rigidbody) { Temp_Rigidbody.AddForce(Ray_Direction * Explosion_Force * Distance_Loss); } // Add damage. Damage_Control_CS Temp_Script = Temp_Target_Collider.GetComponent <Damage_Control_CS>(); if (Temp_Script) { Temp_Script.Breaker(Explosion_Force * Distance_Loss); } } } } }
void Create() { // Check for part's children. GameObject Temp_Object; int Child_Count = 0; if (Parent_Transform.Find("Barrel")) { Temp_Object = Parent_Transform.Find("Barrel").gameObject; Child_Count = Temp_Object.transform.childCount; } else { Temp_Object = null; } // Change children's hierarchy, and delete old part. GameObject[] Children = new GameObject[Child_Count]; if (Child_Count > 0) { for (int i = 0; i < Child_Count; i++) { Children[i] = Temp_Object.transform.GetChild(0).gameObject; Children[i].transform.parent = Parent_Transform; } } if (Temp_Object) { DestroyImmediate(Temp_Object); } // Create new Gameobject & Set Transform. GameObject Part_Object = new GameObject("Barrel"); Part_Object.transform.parent = Parent_Transform; Part_Object.transform.localPosition = -Parent_Transform.localPosition + new Vector3(Offset_XProp.floatValue, Offset_YProp.floatValue, Offset_ZProp.floatValue); Part_Object.transform.localRotation = Quaternion.identity; // Add components Part_Object.AddComponent <MeshRenderer> (); Material [] Temp_Materials = new Material [Materials_NumProp.intValue]; for (int i = 0; i < Temp_Materials.Length; i++) { Temp_Materials [i] = MaterialsProp.GetArrayElementAtIndex(i).objectReferenceValue as Material; } Part_Object.GetComponent <Renderer>().materials = Temp_Materials; MeshFilter Temp_MeshFilter = Part_Object.AddComponent <MeshFilter> (); Temp_MeshFilter.mesh = Part_MeshProp.objectReferenceValue as Mesh; if (Collider_MeshProp.objectReferenceValue) { MeshCollider Temp_MeshCollider = Part_Object.AddComponent <MeshCollider> (); Temp_MeshCollider.sharedMesh = Collider_MeshProp.objectReferenceValue as Mesh; Temp_MeshCollider.convex = true; } if (Sub_Collider_MeshProp.objectReferenceValue) { MeshCollider Temp_MeshCollider = Part_Object.AddComponent <MeshCollider> (); Temp_MeshCollider.sharedMesh = Sub_Collider_MeshProp.objectReferenceValue as Mesh; Temp_MeshCollider.convex = true; } // Add script Damage_Control_CS Temp_Damage_Control_CS = Part_Object.AddComponent <Damage_Control_CS> (); Temp_Damage_Control_CS.Type = 4; // 4 = Barrel in "Damage_Control" Temp_Damage_Control_CS.Durability = DurabilityProp.floatValue; Temp_Damage_Control_CS.Sub_Durability = Sub_DurabilityProp.floatValue; Temp_Damage_Control_CS.Trouble_Time = Trouble_TimeProp.floatValue; Temp_Damage_Control_CS.Trouble_Effect_Object = Trouble_Effect_ObjectProp.objectReferenceValue as GameObject; // Set Layer Part_Object.layer = 0; // Return its children. if (Child_Count > 0) { for (int i = 0; i < Child_Count; i++) { Children[i].transform.parent = Part_Object.transform; } } }
void Set_Static_Track_Value() { // Add Script. Static_Track_CS Temp_Script; Temp_Script = gameObject.AddComponent <Static_Track_CS> (); Temp_Script.Front_Transform = Front_Transform; Temp_Script.Rear_Transform = Rear_Transform; if (Type == 1) { Temp_Script.Type = 1; Temp_Script.Anchor_Name = Anchor_Name; Temp_Script.Anchor_Parent_Name = Anchor_Parent_Name; } else if (Front_Transform.GetComponent <Static_Track_Setting_CS> ().Type == 1) { Temp_Script.Type = 2; } else if (Rear_Transform.GetComponent <Static_Track_Setting_CS> ().Type == 1) { Temp_Script.Type = 2; } else { Temp_Script.Type = 0; } Temp_Script.enabled = false; // Remove_Components. if (gameObject.GetComponent <HingeJoint>()) { Destroy(gameObject.GetComponent <HingeJoint>()); } if (GetComponent <Rigidbody>()) { Destroy(GetComponent <Rigidbody>()); } Damage_Control_CS Temp_Damage_Control_Script = GetComponent <Damage_Control_CS> (); if (Temp_Damage_Control_Script) { Destroy(Temp_Damage_Control_Script); } Stabilizer_CS Temp_Stabilizer_Script = GetComponent <Stabilizer_CS> (); if (Temp_Stabilizer_Script) { Destroy(Temp_Stabilizer_Script); } // Disable BoxCollider. BoxCollider Temp_BoxCollider = GetComponent <BoxCollider> (); if (Temp_BoxCollider) { Temp_BoxCollider.enabled = false; } // Remove_Child. for (int i = 0; i < transform.childCount; i++) { Destroy(transform.GetChild(0).gameObject); } // Destroy this script/ Destroy(this); }
void Hit(GameObject Temp_Object, Vector3 Temp_Normal) { Live_Flag = false; if (Type == 1) { // HE Destroy(GetComponent <Renderer>()); Destroy(GetComponent <Rigidbody>()); Destroy(GetComponent <Collider>()); // Create HE Explosion Particle. if (Explosion_Object) { Instantiate(Explosion_Object, This_Transform.position, Quaternion.identity); } } // Send Message if (Temp_Object) { Damage_Control_CS Temp_Script = Temp_Object.GetComponent <Damage_Control_CS>(); if (Temp_Script) { // Hit object has "Damage_Control" script. if (Type == 0) { // AP // Create AP Ricochet Particle. if (Ricochet_Object) { Instantiate(Ricochet_Object, This_Transform.position, Quaternion.identity); } // Calculate Hit_Energy. float Hit_Angle = Mathf.Abs(90.0f - Vector3.Angle(This_Rigidbody.velocity, Temp_Normal)); float Hit_Energy = 0.5f * This_Rigidbody.mass * Mathf.Pow(This_Rigidbody.velocity.magnitude, 2); Hit_Energy *= Mathf.Lerp(0.0f, 1.0f, Mathf.Sqrt(Hit_Angle / 90.0f)); Hit_Energy *= Attack_Multiplier; // Output for debug. if (Debug_Flag) { Debug.Log("AP Damage " + Hit_Energy + " on " + Temp_Object.name); } // Send 'Hit_Energy' to "Damage_Control" script. if (current_player == 1) { Destroy(this.gameObject); return; } if (Temp_Script.Breaker(Hit_Energy)) { Destroy(this.gameObject); } } else { // HE Explosion_Force *= Attack_Multiplier; // Output for debug. if (Debug_Flag) { Debug.Log("HE Damage " + Explosion_Force + " on " + Temp_Object.name); } // Send 'Explosion_Force' to "Damage_Control" script. Temp_Script.Breaker(Explosion_Force); } } else { // Hit object does not have "Damage_Control" script. if (Type == 0) { // AP // Create AP Impact Particle. if (Impact_Object) { Instantiate(Impact_Object, This_Transform.position, Quaternion.identity); } } } } // Explosion process. if (Type == 1) { // HE // Search objects in the Explosion_Radius. Collider[] Temp_Colliders = Physics.OverlapSphere(This_Transform.position, Explosion_Radius); foreach (Collider Target_Collider in Temp_Colliders) { //StartCoroutine ( "Add_Explosion_Force" , Target_Collider ) ; Add_Explosion_Force(Target_Collider); } Destroy(this.gameObject, 0.01f * Explosion_Radius); } }
void Create() { MainBody_Object.GetComponent <Rigidbody>().mass = Body_MassProp.floatValue; MainBody_Object.GetComponent <MeshFilter> ().mesh = Body_MeshProp.objectReferenceValue as Mesh; Material [] Temp_Materials = new Material [Materials_NumProp.intValue]; for (int i = 0; i < Temp_Materials.Length; i++) { Temp_Materials [i] = MaterialsProp.GetArrayElementAtIndex(i).objectReferenceValue as Material; } MainBody_Object.GetComponent <Renderer>().materials = Temp_Materials; MeshCollider[] Temp_MeshColliders; Temp_MeshColliders = MainBody_Object.GetComponents <MeshCollider> (); MeshCollider Main_MeshCollider; MeshCollider Sub_MeshCollider; switch (Temp_MeshColliders.Length) { case 0: Main_MeshCollider = MainBody_Object.AddComponent <MeshCollider> (); Sub_MeshCollider = MainBody_Object.AddComponent <MeshCollider> (); break; case 1: Main_MeshCollider = Temp_MeshColliders [0] as MeshCollider; Sub_MeshCollider = MainBody_Object.AddComponent <MeshCollider> (); break; default: Main_MeshCollider = Temp_MeshColliders [0] as MeshCollider; Sub_MeshCollider = Temp_MeshColliders [1] as MeshCollider; break; } if (Collider_MeshProp.objectReferenceValue) { Main_MeshCollider.enabled = true; Main_MeshCollider.sharedMesh = Collider_MeshProp.objectReferenceValue as Mesh; Main_MeshCollider.convex = true; } else { Main_MeshCollider.enabled = false; } if (Sub_Collider_MeshProp.objectReferenceValue) { Sub_MeshCollider.enabled = true; Sub_MeshCollider.sharedMesh = Sub_Collider_MeshProp.objectReferenceValue as Mesh; Sub_MeshCollider.convex = true; } else { Sub_MeshCollider.enabled = false; } // Add script Damage_Control_CS Temp_Damage_Control_CS = MainBody_Object.GetComponent <Damage_Control_CS> (); if (Temp_Damage_Control_CS == null) { Temp_Damage_Control_CS = MainBody_Object.AddComponent <Damage_Control_CS> (); } Temp_Damage_Control_CS.Type = 5; // 5 = MainBody in "Damage_Control" Temp_Damage_Control_CS.Durability = DurabilityProp.floatValue; Temp_Damage_Control_CS.Turret_Number = Turret_NumberProp.intValue; // Set Layer. MainBody_Object.layer = 11; // Ignore wheels. }