Unity游戏(Assault空对地打击)开发(7) 爆炸效果
效果
准备
首先请手搓一个敌军基地。
然后添加一个火焰特效插件或者自建。
爆炸脚本编写
新建一个脚本命名为Explode。
无需挂载到对象上。
首先是全部代码。
using System.Collections; using System.Collections.Generic; using System.Linq; using TMPro; using UnityEngine; using UnityEngine.UIElements; public class Explode : MonoBehaviour { private GameObject fireObj; public void ExplodeEffect(Transform t, float explodeForce, float explodeRadius, float upForce) { fireObj = GameObject.Find("FireEffect"); Collider[] colliders = Physics.OverlapSphere(t.position, explodeRadius / 3); // 扫描碰撞体 foreach (Collider collider in colliders) { Transform tr = collider.gameObject.transform; GameObject fire = Instantiate(fireObj, tr.position, Quaternion.identity); if (tr.tag == "Car") fire.transform.localScale = new Vector3(1f, 1f, 1f); else if (tr.tag == "Plane" || tr.tag == "Player") fire.transform.localScale = new Vector3(3f, 3f, 3f); else fire.transform.localScale = new Vector3(1.5f, 1.5f, 1.5f); fire.transform.SetParent(tr.transform); } colliders = Physics.OverlapSphere(t.position, explodeRadius); foreach (Collider collider in colliders) { Rigidbody rb = collider.GetComponent<Rigidbody>(); if (rb != null) { Vector3 explosionDirection = rb.transform.position - t.position; rb.AddExplosionForce(explodeForce, t.position, explodeRadius, upForce); } } } }
看到一大串代码不要慌,马上解释清楚。
fireObj是火焰粒子效果的原始对象。
private GameObject fireObj;
ExplodeEffect()是处理爆炸事件的函数。
Transform t:爆炸游戏对象的transform。
float explodeForce:爆炸的力度。
float explodeRadios:受影响范围的半径。
float upForce:受影响物体向上的力,通俗地说,就是“炸飞”。
public void ExplodeEffect(Transform t, float explodeForce, float explodeRadius, float upForce)
找到FireEffect,用fire表示(提前准备)。
fireObj = GameObject.Find("FireEffect");
接下来是爆炸效果
第一部分:
扫描以爆炸半径1/3为半径内的所有碰撞体并存入colliders。
遍历colliders。
获取每个碰撞体所在的transform。
克隆一份火,根据不同的物体标签设置不同的大小。
把火的父游戏对象设置为该碰撞体所在的transform。
对于不同的物体,请预先添加标签。
Collider[] colliders = Physics.OverlapSphere(t.position, explodeRadius / 3); foreach (Collider collider in colliders) { Transform tr = collider.gameObject.transform; GameObject fire = Instantiate(fireObj, tr.position, Quaternion.identity); if (tr.tag == "Car") fire.transform.localScale = new Vector3(1f, 1f, 1f); else if (tr.tag == "Plane" || tr.tag == "Player") fire.transform.localScale = new Vector3(3f, 3f, 3f); else fire.transform.localScale = new Vector3(1.5f, 1.5f, 1.5f); fire.transform.SetParent(tr.transform); }
第二部分:
扫描整个爆炸范围。
给找到的每个刚体添加爆炸力。
colliders = Physics.OverlapSphere(t.position, explodeRadius); foreach (Collider collider in colliders) { Rigidbody rb = collider.GetComponent<Rigidbody>(); if (rb != null) { Vector3 explosionDirection = rb.transform.position - t.position; // 计算力的方向 rb.AddExplosionForce(explodeForce, t.position, explodeRadius, upForce); } }
玩家生命值控制脚本编写(部分)
代码不是完整的。
挂载到Player上。
using Cinemachine; using System.Collections; using System.Collections.Generic; using Unity.VisualScripting; using UnityEngine; public class PlayerLifeCtrl : MonoBehaviour { public bool die = false; private void OnCollisionEnter(Collision Info) { if (Info.gameObject.tag == "Terrain" && die == false) { Camera.main.GetComponent<CinemachineBrain>().enabled = false; die = true; Explode explode = new Explode(); explode.ExplodeEffect(transform, gameObject.GetComponent<FlightCtrl>().moveSpeed * 2f, gameObject.GetComponent<FlightCtrl>().moveSpeed * 0.275f, gameObject.GetComponent<FlightCtrl>().moveSpeed * 3f); transform.GetComponent<FlightCtrl>().enabled = false; transform.GetComponent<Rigidbody>().velocity = Vector3.zero; transform.GetComponent<Rigidbody>().useGravity = true; } } }
函数:当开始碰撞。
private void OnCollisionEnter(Collision Info)
如果碰到了山、地、飞机:
禁用摄像机跟随;
标记死亡;
创建一个Explode对象,进行爆炸(参数随你);
禁用飞行脚本;
速度归零;
自由落体。