当前位置: 首页 > article >正文

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对象,进行爆炸(参数随你);

禁用飞行脚本;

速度归零;

自由落体。


http://www.kler.cn/a/536719.html

相关文章:

  • Excel 融合 deepseek
  • Java使用aspose实现pdf转word
  • apisix网关ip-restriction插件使用说明
  • 详解python的单例模式
  • 数据结构:顺序表
  • MySQL----case的用法
  • 前沿型CLI库——Clipanion
  • Qt 获取鼠标所在点颜色的RGB值,考虑多屏幕情况
  • 机器学习 - 容易混淆的目标函数和损失函数
  • 借助 Cursor 快速实现小程序前端开发
  • 探秘数据结构之单链表:从原理到实战的深度解析
  • ​零技术开始,但想用 Next.js 基于 React 构建一个类似 18Touch 的网站​
  • 【开源项目】数字孪生武汉~超经典智慧城市CIM/BIM数字孪生可视化项目——开源工程及源码
  • (文末提供数据集下载)ML.NET库学习001:基于PCA的信用卡异常检查之样本处理与训练
  • 如何在Windows上使用Docker
  • OCR与多模态大模型的关系
  • PDF转图片及拼接- ImageMagick
  • 【学习笔记】OpenGL的基础纹理贴图相关知识
  • HarmonyOS 5.0应用开发——ContentSlot的使用
  • PyMysql 快速入门——Python 操作 MySQL 数据库的利器
  • Zenoh在工业物联网场景中的性能研究
  • 【开源AI】AI一页一页读PDF
  • 【算法专场】分治(下)
  • 对接DeepSeek
  • MapReduce简单应用(二)——去重、排序和平均
  • 深入解析:如何利用 Java 爬虫按关键字搜索淘宝商品