Search Unity

Question About Unity Abstract Class Susbscribe an Action

Discussion in 'Scripting' started by kasimridvan, Mar 20, 2023.

  1. kasimridvan

    kasimridvan

    Joined:
    Aug 12, 2018
    Posts:
    8
    I'm having a problem when subscribing an abstract class to an action in Unity. When I invoke the action, it sometimes executes more than once. However, when I subscribe a subclass to the action, it works correctly. What could be the reason for this?
    This issue occurs when the user watches an ad and earns a reward.
    I'm using Unity 2021.3.19.f1 LTS
    Android platform
    Here is my code:
    SRTAdManager.cs
    Code (CSharp):
    1. public class SRTAdManager : MonoBehaviour
    2. {
    3.    
    4. void Awake()
    5.     {
    6.         if (instance == null)
    7.         {
    8.             instance = this;
    9.         }
    10.         else {
    11.              Destroy(this.gameObject);
    12.         }
    13.     }
    14.     ...
    15.     public event Action<string> onAdReward;
    16.     public void UserEarnedReward(string rewardType)
    17.     {
    18.         onAdReward?.Invoke(rewardType);
    19.     }
    20.     ...
    21. }
    SRTAdmobAdManager.cs
    Code (CSharp):
    1. public class SRTAdmobAdManager : MonoBehaviour
    2. {
    3.     ...
    4.     public void ShowAdmobRewarded(string userReward)
    5.     {
    6.         if (IsRewardedLoaded())
    7.         {
    8.             this.userReward = userReward;
    9.             this.rewardedAd.Show();
    10.         }
    11.         else {
    12.             LoadAdmobRewarded();
    13.         }
    14.     }
    15.     public void HandleUserEarnedReward(object sender, Reward args)
    16.     {
    17.         SRTAdManager.instance.UserEarnedReward(userReward);
    18.     }
    19.     ...
    20. }
    RideUIManager.cs
    Code (CSharp):
    1. public abstract class RideUIManager : MonoBehaviour
    2. {
    3.     ...
    4.     protected virtual void OnEnable()
    5.     {
    6.         SRTAdManager.instance.onAdReward += OnReward;
    7.     }
    8.     protected virtual void OnDestroy()
    9.     {
    10.         SRTAdManager.instance.onAdReward -= OnReward;
    11.     }
    12.     public abstract void OnReward(string rewardType);
    13.     ...
    14. }
    AdvancedRideUIManager.cs
    Code (CSharp):
    1. public class AdvancedRideUIManager : RideUIManager
    2. {
    3.     protected override void OnEnable()
    4.     {
    5.         base.OnEnable();
    6.     }
    7.     protected override void OnDestroy()
    8.     {
    9.         base.OnDestroy();
    10.     }
    11.     public override void OnReward(string rewardType)
    12.     {
    13.         if (rewardType.Equals("MoneyBonusADV"))
    14.         {
    15.                 reward *= 2;
    16.                 doubleItButton.SetActive(false);
    17.                 rewardText.text = reward.ToString();
    18.         }
    19.         if (rewardType.Equals("BonusTimeADV"))
    20.         {
    21.                 loseModalWindowManager.ModalWindowOut();
    22.                 advancedRide.advancedRide.remaningTime = rewardInfo.bonusTime;
    23.                 advancedRide.hasTime = true;
    24.                 advancedRide.enumared = false;
    25.                 GameEventManager.GameEventPost(
    26.                     "Bonus Time"
    27.                 );
    28.                 SetAudio(false);
    29.                 Time.timeScale = 1;
    30.         }
    31.     }
    32. }