Что нужно сделать, чтобы устроить пожар:
1. На те объекты, которым позволительно гореть, надо повесить скрипт FireController. У него есть несколько свойств:
а) Is Combustible (boolean) ― может ли объект загораться,
б) Is Burning (boolean) ― горит ли объект в данный момент,
в) Intensity (int) ― интенсивность горения (пока это просто количество частиц огня; чем больше объект, тем большее желательно значение).
2. Добавить любой коллайдер к объектам, которые должны уметь загораться от горящих соседей.
3. Поместить на сцену экземпляр префаба FireManager. У него есть два свойства:
а) Burning Dummy Prefab ― болванка с настроенной системой частиц для показа пламени.
б) Sparking Dummy Prefab ― болванка с настроенной системой частиц для разлетающихся угольков.
Как работает:
1. При старте FireManager находит все объекты с подключенным FireController и поджигает те, у которых IsBurning = true.
2. Когда объект зажигается, в его позиции в пространстве создаются невидимые экземпляры источников частиц пламени и угольков. В них используется MeshParticleEmitter, у которого свойство mesh подменяется сеткой реального поджигаемого объекта. В результате частицы появляются по всей поверхности объекта.
3. Если разлетающиеся в разные стороны угольки попадают на соседний объект, у которого есть какой-нибудь коллайдер, подключен скрипт FireController и в нем IsCombustible = true, то этот соседний объект точно так же загорается.
4. Чтобы поджечь объект вручную, у него нужно вызвать функцию Ignite(). Чтобы погасить горящий объект ― функцию Extinguish().
Код скриптов:
Синтаксис:
Используется csharp
using System.Collections.Generic;
using UnityEngine;
public class FireController : MonoBehaviour
{
/// <summary>
/// All currently burning objects dictionary.
/// Key - burning object, Value - array of burning dummy and sparking dummy instances
/// </summary>
private static readonly Dictionary<GameObject, GameObject[]> burningObjectDictionary = new Dictionary<GameObject, GameObject[]>();
/// <summary>
/// Affects <span class="posthilit">particle</span> emission amount when burning
/// </summary>
public int intensity = 50;
public bool isBurning = false;
public bool isCombustible = true;
// Start burning
public void Ignite()
{
isBurning = true;
var fireManager = (FireManager) FindObjectOfType(typeof (FireManager));
if (fireManager == null)
{
print("[Error] Igniting failed: can't find FireManager on scene.");
return;
}
if (fireManager.burningDummyPrefab == null)
{
print("[Error] Igniting failed: burningDummyPrefab is not specified in FireManager.");
return;
}
if (fireManager.sparkingDummyPrefab == null)
{
print("[Error] Igniting failed: sparkingDummyPrefab is not specified in FireManager.");
return;
}
var fireDummy = (GameObject) Instantiate(fireManager.burningDummyPrefab);
fireDummy.transform.localPosition = transform.localPosition;
fireDummy.transform.localRotation = transform.localRotation;
fireDummy.transform.localScale = transform.localScale;
fireDummy.transform.parent = transform;
var sparkingDummy = (GameObject) Instantiate(fireManager.sparkingDummyPrefab);
sparkingDummy.transform.localPosition = transform.localPosition;
sparkingDummy.transform.localRotation = transform.localRotation;
sparkingDummy.transform.localScale = transform.localScale;
sparkingDummy.transform.parent = transform;
var burningDummyMeshFilter = (MeshFilter) fireDummy.GetComponent("MeshFilter");
if (burningDummyMeshFilter == null)
{
print("[Error] Igniting failed: burningDummyPrefab in FireManager have no MeshFilter component");
return;
}
var sparkingDummyMeshFilter = (MeshFilter) sparkingDummy.GetComponent("MeshFilter");
if (sparkingDummyMeshFilter == null)
{
print("[Error] Igniting failed: sparkingDummyPrefab in FireManager have no MeshFilter component");
return;
}
var targetMeshFilter = (MeshFilter) GetComponent("MeshFilter");
if (targetMeshFilter == null)
{
print(string.Format("[Error] Igniting faild: burning object ({0}) have no MeshFilter component", name));
return;
}
burningDummyMeshFilter.<span class="posthilit">mesh</span> = sparkingDummyMeshFilter.<span class="posthilit">mesh</span> = targetMeshFilter.<span class="posthilit">mesh</span>;
var targetFireController = (FireController) GetComponent("FireController");
fireDummy.particleEmitter.minEmission = fireDummy.particleEmitter.maxEmission = targetFireController.intensity;
burningObjectDictionary.Add(gameObject, new[] {fireDummy, sparkingDummy});
}
// Stop burning
public void Extinguish()
{
isBurning = false;
if (burningObjectDictionary.ContainsKey(gameObject) == false)
{
print(string.Format("[Warning] Can't extinguish the object ({0}) that isn't burning.", name));
}
var dummies = burningObjectDictionary[gameObject];
burningObjectDictionary.Remove(gameObject);
Destroy(dummies[0]);
Destroy(dummies[1]);
}
// Ignite the object if a spark <span class="posthilit">particle</span> hits it
private void OnParticleCollision(GameObject target)
{
var controller = (FireController) target.GetComponent("FireController");
if (controller == null)
{
return;
}
if (controller.isCombustible && controller.isBurning == false)
{
controller.Ignite();
}
}
}
using UnityEngine;
public class FireController : MonoBehaviour
{
/// <summary>
/// All currently burning objects dictionary.
/// Key - burning object, Value - array of burning dummy and sparking dummy instances
/// </summary>
private static readonly Dictionary<GameObject, GameObject[]> burningObjectDictionary = new Dictionary<GameObject, GameObject[]>();
/// <summary>
/// Affects <span class="posthilit">particle</span> emission amount when burning
/// </summary>
public int intensity = 50;
public bool isBurning = false;
public bool isCombustible = true;
// Start burning
public void Ignite()
{
isBurning = true;
var fireManager = (FireManager) FindObjectOfType(typeof (FireManager));
if (fireManager == null)
{
print("[Error] Igniting failed: can't find FireManager on scene.");
return;
}
if (fireManager.burningDummyPrefab == null)
{
print("[Error] Igniting failed: burningDummyPrefab is not specified in FireManager.");
return;
}
if (fireManager.sparkingDummyPrefab == null)
{
print("[Error] Igniting failed: sparkingDummyPrefab is not specified in FireManager.");
return;
}
var fireDummy = (GameObject) Instantiate(fireManager.burningDummyPrefab);
fireDummy.transform.localPosition = transform.localPosition;
fireDummy.transform.localRotation = transform.localRotation;
fireDummy.transform.localScale = transform.localScale;
fireDummy.transform.parent = transform;
var sparkingDummy = (GameObject) Instantiate(fireManager.sparkingDummyPrefab);
sparkingDummy.transform.localPosition = transform.localPosition;
sparkingDummy.transform.localRotation = transform.localRotation;
sparkingDummy.transform.localScale = transform.localScale;
sparkingDummy.transform.parent = transform;
var burningDummyMeshFilter = (MeshFilter) fireDummy.GetComponent("MeshFilter");
if (burningDummyMeshFilter == null)
{
print("[Error] Igniting failed: burningDummyPrefab in FireManager have no MeshFilter component");
return;
}
var sparkingDummyMeshFilter = (MeshFilter) sparkingDummy.GetComponent("MeshFilter");
if (sparkingDummyMeshFilter == null)
{
print("[Error] Igniting failed: sparkingDummyPrefab in FireManager have no MeshFilter component");
return;
}
var targetMeshFilter = (MeshFilter) GetComponent("MeshFilter");
if (targetMeshFilter == null)
{
print(string.Format("[Error] Igniting faild: burning object ({0}) have no MeshFilter component", name));
return;
}
burningDummyMeshFilter.<span class="posthilit">mesh</span> = sparkingDummyMeshFilter.<span class="posthilit">mesh</span> = targetMeshFilter.<span class="posthilit">mesh</span>;
var targetFireController = (FireController) GetComponent("FireController");
fireDummy.particleEmitter.minEmission = fireDummy.particleEmitter.maxEmission = targetFireController.intensity;
burningObjectDictionary.Add(gameObject, new[] {fireDummy, sparkingDummy});
}
// Stop burning
public void Extinguish()
{
isBurning = false;
if (burningObjectDictionary.ContainsKey(gameObject) == false)
{
print(string.Format("[Warning] Can't extinguish the object ({0}) that isn't burning.", name));
}
var dummies = burningObjectDictionary[gameObject];
burningObjectDictionary.Remove(gameObject);
Destroy(dummies[0]);
Destroy(dummies[1]);
}
// Ignite the object if a spark <span class="posthilit">particle</span> hits it
private void OnParticleCollision(GameObject target)
{
var controller = (FireController) target.GetComponent("FireController");
if (controller == null)
{
return;
}
if (controller.isCombustible && controller.isBurning == false)
{
controller.Ignite();
}
}
}
Синтаксис:
Используется csharp
using UnityEngine;
public class FireManager : MonoBehaviour
{
public GameObject burningDummyPrefab = null;
public GameObject sparkingDummyPrefab = null;
// Ignite all objects with isBurning == true
private void Start()
{
var targets = FindObjectsOfType(typeof (FireController));
foreach (FireController target in targets)
{
if (target.isBurning)
{
target.Ignite();
}
}
}
}
public class FireManager : MonoBehaviour
{
public GameObject burningDummyPrefab = null;
public GameObject sparkingDummyPrefab = null;
// Ignite all objects with isBurning == true
private void Start()
{
var targets = FindObjectsOfType(typeof (FireController));
foreach (FireController target in targets)
{
if (target.isBurning)
{
target.Ignite();
}
}
}
}
Ссылка на package:
http://www.autosim-utilities.ru/unity/F ... itypackage
Тест:
HTML код для вашего блога :