Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 12 Next capture
2021 2022 2023
1 capture
12 Jun 22 - 12 Jun 22
sparklines
Close Help
  • 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 /
  • Help Room /
avatar image
0
Question by IamTabu316 · Jun 17, 2017 at 03:56 PM · c#instantiate prefabenemiesinstantiatingpickups

How Do I Instantiate Multiple Coins Once The Enemy Dies?

I am making a 2D Platformer and I am trying to make it so when the enemy dies he will drop 3-5 coins. Can someone help me @numberkruncher?

Comment
Add comment
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

1 Reply

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

Answer by numberkruncher · Jun 17, 2017 at 08:18 PM

You could have a CoinRewarder component that looking something like this:

 // CoinRewarder.cs
 // Attach this to any game object that can reward coins for whatever reason
 // (be it an enemy kill reward, collectable coin, gold, etc).
 public sealed class CoinRewarder : MonoBehaviour
 {
     [SerializeField]
     private int minimumCoinReward = 3;
     [SerializeField]
     private int maximumCoinReward = 5;
 
 
     public int MinimumCoinReward {
         get { return this.minimumCoinReward; }
         set { this.minimumCoinReward = value; }
     }
 
     public int MaximumCoinReward {
         get { return this.maximumCoinReward; }
         set { this.maximumCoinReward = value; }
     }
 
 
     public void Reward()
     {
         // Randomly pick a coin reward within the given range.
         int coins = Random.Range(this.MinimumCoinReward, this.MaximumCoinReward);

         // Reward coins using the game manager.
         GameManager.Instance.RewardCoins(coins);
     }
 }

Alternatively if you want to spawn instances of a coin prefab:

 // PrefabSpawner.cs
 // Attach this to any game object that can spawn prefabs for whatever reason
 // (be it coins, gold, explosion particles, etc.).
 public sealed class PrefabSpawner : MonoBehaviour
 {
     [SerializeField]
     private int minimumCount = 3;
     [SerializeField]
     private int maximumCount = 5;
     [SerializeField]
     private GameObject prefab = null;
 
     public int MinimumCount {
         get { return this.minimumCount; }
         set { this.minimumCount= value; }
     }
     public int MaximumCount {
         get { return this.maximumCount ; }
         set { this.maximumCount = value; }
     }
     public GameObject Prefab{
         get { return this.prefab; }
         set { this.prefab= value; }
     }
 
     public void Spawn()
     {
         // Randomly pick the count of prefabs to spawn.
         int count = Random.Range(this.MinimumCount, this.MaximumCount );
         // Spawn them!
         for (int i = 0; i < count; ++i) {
             Instantiate(this.prefab, this.transform.position, Quaternion.identity);
         }
     }
 }

The above obviously needs to be activated somehow; here is how you could allow for this to be wired up:

 // IDamagable.cs
 // The interface for something that can take damage.
 public interface IDamagable
 {
     void TakeDamage(float damage, Object instigator);
 }


 // HealthComponent.cs
 // Attach this to any character that has health and can die
 // (be it player or enemy or a destructible chest)
 public sealed class HealthComponent : MonoBehaviour, IDamagable
 {
     [SerializeField]
     private float initialHealth = 100f;
     [SerializeField]
     private float initialMaximumHealth = 100f;
 
     [SerializeField]
     private UnityEvent onDied;
 
 
     private float health;
     private float maximumHealth;
 
 
     public float InitialHealth {
         get { return this.initialHealth; }
         set { this.initialHealth = Mathf.Max(0f, value); }
     }
 
     public float InitialMaximumHealth {
         get { return this.initialMaximumHealth; }
         set { this.initialMaximumHealth = Mathf.Max(0f, value); }
     }
 
     public float Health {
         get { return this.health; }
         set { this.health = Mathf.Clamp(value, 0f, this.MaximumHealth); }
     }
 
     public float MaximumHealth {
         get { return this.maximumHealth; }
         set { this.maximumHealth = Mathf.Max(0f, value); }
     }
 
 
     public UnityEvent DiedEvent {
         get { return this.onDied; }
     }
 
 
     private void OnEnable()
     {
         this.Health = this.InitialHealth;
         this.MaximumHealth = this.InitialMaximumHealth;
     }
 
     private void OnDiedEvent()
     {
         var handler = this.onDied;
         if (handler != null) {
             handler.Invoke();
         }
     }
 
 
     public void TakeDamage(float damage, Object instigator)
     {
         this.Health -= damage;
 
         // Has the player just died?
         if (Mathf.Approximately(this.Health, 0f)) {
             this.OnDiedEvent();
         }
     }
 }

So, how can these two components play nice together? Easy, there are a whole number of ways, but to keep things simple, here are two ways:

  1. You can wire them up using the inspector.

    Wiring up the coin reward method to the died event of the health component using the inspector.

  2. You can wire them up using another script (for example, an EnemyController component).

     // EnemyController.cs
       public class EnemyController : MonoBehaviour
       {
           protected HealthComponent healthComponent;
     
     
           protected virtual void OnEnable()
           {
               this.healthComponent = this.GetComponent<HealthComponent>();
               this.healthComponent.DiedEvent.AddListener(this.OnDied);
           }
     
           protected virtual void OnDied()
           {
               var coinRewarder = this.GetComponent<CoinRewarder>();
               if (coinRewarder != null) {
                   coinRewarder.RewardCoins();
               }
           }
       }
    
    

And as for the enemy taking damage:

 // Projectile.cs
 public class Projectile : MonoBehaviour
 {
     [SerializeField]
     private float damage = 10f;
 
 
     public float Damage {
         get { return this.damage; }
         set { this.damage = value; }
     }
 
 
     private void OnCollisionEnter(Collision collision)
     {
         var damagable = collision.gameObject.GetComponent<IDamagable>();
         if (damagable != null) {
             damagable.TakeDamage(this.Damage, this);
         }
 
         Destroy(this.gameObject);
     }
 }

I hope that you find this helpful!


2017-06-17-21-14-32.gif (105.1 kB)
Comment
Add comment · Show 1 · 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
avatar image SaltwaterAssemnly · Sep 02, 2019 at 01:43 AM 0
Share

Curious why you bothered with the interface?

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.

Follow this Question

Answers Answers and Comments

369 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Generating random points and instantiating prefabs with a set distance 0 Answers

Having trouble instantiating prefabs in my 2D game 1 Answer

Instantiate And move the GameObject to the click position from another position. 1 Answer

Multiple different bullet damages for multiple enemies 1 Answer

Less code for same thing 1 Answer


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges