• Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
2
Question by Selzier · Oct 01, 2014 at 03:10 AM · gameobjectraycastparticlesystemraycasthitplay

Play ParticleSystem on RayCastHit Object

I have a GameObject with a Particle System component on it (this is an enemy).

I have attached a blood Particle Effect to enemy so when I hit the enemy, the blood will show.

How can I play the Particle System on an object I hit with RayCastHit?

I have tried everything I can think of over the past hour or 2, no luck:

 if(Physics.Linecast(playertarget.transform.position, attackrange.transform.position, out hit)){
     if(hit.transform){
         hit.transform.particleSystem.Play();





Comment
Add comment · Show 5
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image robertbu · Oct 01, 2014 at 03:52 AM 0
Share

You don't have to check for a transform. If the LineCast() hits something, then a transform will exist. So now you need to debug.

  Debug.DrawLine(playertarget.transform.position, attackrange.transform.position);
  if(Physics.Linecast(playertarget.transform.position, attackrange.transform.position, out hit)) {
       Debug.Log(hit.collider.name + ", " + hit.collider.tag);
       hit.transform.particleSystem.Play();
  }

 
avatar image Selzier · Oct 01, 2014 at 04:03 AM 0
Share

Thanks, I removed that check. Logging the collider shows I have hit the correct object. But calling hit.transform.particleSystem.Play(); causes a: NullReferenceException: Object reference not set to an instance of an object


I think maybe because the Particle GameObject is a child, so I try to call: GameObject b = hit.transform.Find("Blood"); But then this causes a: error CS0029: Cannot implicitly convert type UnityEngine.Transform' to UnityEngine.GameObject'

avatar image robertbu · Oct 01, 2014 at 04:22 AM 0
Share

Transform inherits 'particleSystem', so you can do (if you are absolutely sure the object hit has a 'Blood' immediate child):

  hit.transform.Find("Blood").particleSystem.Play();

You should probably be checking the tag or name in the hit before executing this code (to avoid a null reference exception).

avatar image robertbu · Oct 01, 2014 at 05:08 AM 0
Share

$$anonymous$$y guess is that "Blood" is not an immediate child, so you need to specify a path in the Transform.Find(). See the reference. As an alternate, you can try (C#):

   hit.transform.GetComponentInChildren<ParticleSystem>().Play();

...or Javascript:

   hit.transform.GetComponentInChildren(ParticleSystem).Play();


This assumes that there is only one ParticleSystem in the object's children.

avatar image Selzier · Oct 01, 2014 at 05:20 AM 0
Share

Got it working, thanks a ton robertbu! hit.transform.Find("Blood").particleSystem.Play(); works great and I added some error checking as well.

1 Reply

· Add your reply
  • Sort: 
avatar image
0
Best Answer

Answer by Selzier · Oct 01, 2014 at 05:20 AM

Thanks robertbu for the help.

I ended up going with this:

 if (hit.transform.Find("Blood")){
 hit.transform.Find("Blood").particleSystem.Play();
 }

Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Welcome to Unity Answers

The best place to ask and answer questions about development with Unity.

To help users navigate the site we have posted a site navigation guide.

If you are a new user to Unity Answers, check out our FAQ for more information.

Make sure to check out our Knowledge Base for commonly asked Unity questions.

If you are a moderator, see our Moderator Guidelines page.

We are making improvements to UA, see the list of changes.



Follow this Question

Answers Answers and Comments

2 People are following this question.

avatar image avatar image

Related Questions

How to make my raycast also hit deactive objects WITHOUT showing the object? 1 Answer

How do I change the raycasthit material back? 1 Answer

Raycast and RaycastHit failure 2 Answers

Ray Casting - Trigger function 1 Answer

See what object I hit in raycast 0 Answers

  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges