lundi 13 septembre 2021

Event Action Doesn't work in state Pattern

I'm using state pattern for my unity game. I have three states; HappyState, SurprisedState and SadState. HappyState is default state. I want the character to jump and enter surprised state by clicking left-mouse. Entering surprised state, a few jobs need to be done which I defined as a void to be subscribed to an event, But it doesn't work!

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System;

public class CapsuleScript : MonoBehaviour
{
    public event Action SliderAction;
    public Slider slider;
    public Text stateText;
    public GameObject hands;
    public Rigidbody rb;
    public CapsuleBasicStates currentstate;
    public readonly HappyState happyState = new HappyState();
    public readonly SadState sadState = new SadState();
    public readonly SurprisedState surprisedState = new SurprisedState();
    public SpriteRenderer renderer;
    public Sprite happysprite, sadsprite, surprisedsprite;
    // Start is called before the first frame update
    void Start()
    {
        slider.value = 0;
        renderer = GetComponentInChildren<SpriteRenderer>();
        rb = GetComponent<Rigidbody>();
        TransitionToState(happyState);
        
    }
    public void OnCollisionEnter(Collision other) {
        currentstate.OnCollisionEnter(this);
        
    }

    // Update is called once per frame
    void Update()
    {
        currentstate.Update(this);
        
    }
    public void SetSprite(Sprite sprite)
    {
        renderer.sprite = sprite;
    }
    public void TransitionToState(CapsuleBasicStates state)
    {
        currentstate = state;
        currentstate.EnterState(this);

    }
    public IEnumerator SliderHandler()
    {
        yield return new WaitForSeconds(1f);
        slider.value +=1;
        StartCoroutine(SliderHandler());
    }
    public void IEHandler()
    {
        StartCoroutine(SliderHandler());
    }

}

Here is SurprisedState script

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SurprisedState : CapsuleBasicStates
{
    public override void EnterState(CapsuleScript player)
    {
        player.SetSprite(player.surprisedsprite);
        player.stateText.text = player.surprisedState.ToString();
        player.slider.gameObject.SetActive(true);
        player.SliderAction += player.IEHandler;
        
    }
    public override void OnCollisionEnter(CapsuleScript player)
    {
        //player.TransitionToState(player.happyState);
    
    }
    public override void Update(CapsuleScript player)
    {
        if(player.slider.value ==20)
        {
            player.SliderAction -= player.IEHandler;
            player.TransitionToState(player.happyState);
        }
        
    }
}

HappyState script

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class HappyState : CapsuleBasicStates
{
    public override void EnterState(CapsuleScript player)
    {
        player.SetSprite(player.happysprite);
        player.stateText.text = player.happyState.ToString();
        player.hands.SetActive(false);
        
    }
    public override void OnCollisionEnter(CapsuleScript player)
    {
    
    }
    public override void Update(CapsuleScript player)
    {
        if(Input.GetButton("Fire1"))
        {
            player.rb.AddForce(Vector3.up * 150f);
            player.TransitionToState(player.surprisedState);
        }
        if(Input.GetButton("Fire2"))
        {
            player.rb.AddForce(Vector3.up *250f);
            player.TransitionToState(player.sadState);
        }
        
    }
}

Aucun commentaire:

Enregistrer un commentaire