برخورد با پارتیکل در یونیتی particle collision in unity
جمعه, ۲۴ مهر ۱۳۹۴، ۰۹:۰۵ ق.ظ
منبع:gameover.blog.ir
نویسنده این مطلب:سجاد
اسکریپت زیر باعث میشه وقتی به پارتیکلی برخورد کردیم نیرویی در جهت direction به ما وارد بشه:
پارتیکل سیستم شوریکن( Shuriken particle system):
این message به اسکریپت اتچ(وصل) شده به پارتیکل سیستم و collider ای که با آن برخورد کرده ارسال می شود.
وقتی تابع OnParticleCollision از یک اسکریپت وصل شده به gameobject دارای collider فراخوانی(invoke) می شود پارامتر GameObject ، پارتیکل(ParticleSystem) سیستم را نمایش می دهد. Collider حداکثر یک پیام(message) را در پارتیکل سیستم دریافت می کند که در هر فریم با آن برخورد کرده است( حتی وقتی که پارتیکل سیستم با collider با چند پارتیکل سیستم در فریم جاری برخورد کند.)
برای اطلاعات بیشتر در مورد تمام کالیژن های رخ داده با پارتیکل سیستم، می توان از ParticleSystem.GetCollisionEvents استفاده کرد تا آرایه ای از ParticleSystem.CollisionEvent را دریافت نماییم.(نکته : Collision event یعنی رویداد برخورد. یا تابعی که در لحظه ی برخورد صدا زده میشه)
نکته:
پیام های فقط زمانی ارسال می شن که توی پنل inspector گزینه ی /Send Collision Messages/ رو برای particle system collision module فعال کنیم.
OnParticleCollision می تونه یک co-routine باشه و خیلی ساده می تونید دستور yield رو برای انتظار اتمام کار تابع بکار بگیرم:
در مورد coroutine قبلا اینجا توضیح دادیم:
http://gameover.blog.ir/1394/07/04/%D8%AF%D8%B3%D8%AA%D9%88%D8%B1-StartCoroutine-%D8%AF%D8%B1-%DB%8C%D9%88%D9%86%DB%8C%D8%AA%DB%8C
مثال:
منبع اصلی: سایت سازنده یونیتی
نویسنده این مطلب:سجاد
اسکریپت زیر باعث میشه وقتی به پارتیکلی برخورد کردیم نیرویی در جهت direction به ما وارد بشه:
using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { void OnParticleCollision(GameObject other) { Rigidbody body = other.GetComponent<Rigidbody>(); if (body) { Vector3 direction = other.transform.position - transform.position; direction = direction.normalized; body.AddForce(direction * 5); } } }
پارتیکل سیستم شوریکن( Shuriken particle system):
این message به اسکریپت اتچ(وصل) شده به پارتیکل سیستم و collider ای که با آن برخورد کرده ارسال می شود.
وقتی تابع OnParticleCollision از یک اسکریپت وصل شده به gameobject دارای collider فراخوانی(invoke) می شود پارامتر GameObject ، پارتیکل(ParticleSystem) سیستم را نمایش می دهد. Collider حداکثر یک پیام(message) را در پارتیکل سیستم دریافت می کند که در هر فریم با آن برخورد کرده است( حتی وقتی که پارتیکل سیستم با collider با چند پارتیکل سیستم در فریم جاری برخورد کند.)
برای اطلاعات بیشتر در مورد تمام کالیژن های رخ داده با پارتیکل سیستم، می توان از ParticleSystem.GetCollisionEvents استفاده کرد تا آرایه ای از ParticleSystem.CollisionEvent را دریافت نماییم.(نکته : Collision event یعنی رویداد برخورد. یا تابعی که در لحظه ی برخورد صدا زده میشه)
نکته:
پیام های فقط زمانی ارسال می شن که توی پنل inspector گزینه ی /Send Collision Messages/ رو برای particle system collision module فعال کنیم.
OnParticleCollision می تونه یک co-routine باشه و خیلی ساده می تونید دستور yield رو برای انتظار اتمام کار تابع بکار بگیرم:
در مورد coroutine قبلا اینجا توضیح دادیم:
http://gameover.blog.ir/1394/07/04/%D8%AF%D8%B3%D8%AA%D9%88%D8%B1-StartCoroutine-%D8%AF%D8%B1-%DB%8C%D9%88%D9%86%DB%8C%D8%AA%DB%8C
مثال:
using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { public ParticleSystem part; public ParticleCollisionEvent[] collisionEvents; void Start() { part = GetComponent<ParticleSystem>(); collisionEvents = new ParticleCollisionEvent[16]; } void OnParticleCollision(GameObject other) { int safeLength = part.safeCollisionEventSize; if (collisionEvents.Length < safeLength) collisionEvents = new ParticleCollisionEvent[safeLength]; int numCollisionEvents = part.GetCollisionEvents(other, collisionEvents); Rigidbody rb = other.GetComponent<Rigidbody>(); int i = 0; while (i < numCollisionEvents) { if (rb) { Vector3 pos = collisionEvents[i].intersection; Vector3 force = collisionEvents[i].velocity * 10; rb.AddForce(force); } i++; } } }
منبع اصلی: سایت سازنده یونیتی
۹۴/۰۷/۲۴