My delegates are running fine, BUT I want to revert cursor after 2 seconds

I’m trying to build on our work so far and have the cursor flip back to the default arrow after 2 seconds if there has been no layer change, but it’s not working! Anyone have a similar problem or solution ideas?

Here is my CursorAffordance script:

    using System.Collections;
    using UnityEngine;

    public class CursorAffordance : MonoBehaviour {

	[SerializeField] Texture2D[] cursorSprites;  // =: [WalkArrow, TargetSword, UnknownQuestionMark]
	[HideInInspector] public CameraRaycaster raycaster;

	Vector2 _hotspot = Vector2.zero;
	Texture2D _texture;

	[SerializeField] float resetTime = 2f;

	IEnumerator _coroutine;


	void Start () {
		_texture  = Texture2D.blackTexture;  //ugly initialiser
		raycaster = GameObject.FindWithTag("MainCameraRig").GetComponent<CameraRaycaster>();
		Cursor.SetCursor(cursorSprites[0], _hotspot, CursorMode.Auto);
		CameraRaycaster.OnLayerChange += GetTexture;
		_coroutine = ResetSoon();
	}
	


	void GetTexture(Layer layer){   // method called OnLayerChange
		StopCoroutine(_coroutine);
		switch (layer)
		{
			case (Layer.Walkable):
				_texture = cursorSprites[0];
				break;

			case (Layer.Enemy):
				_texture = cursorSprites[1];
				break;
			
			case (Layer.RaycastEndStop):
				_texture = cursorSprites[2];
				break;

			case (Layer.Default):
				_texture = cursorSprites[2];
				break;
			
			default:
				_texture = cursorSprites[0];
				break;
		}
		
		Cursor.SetCursor(_texture, _hotspot, CursorMode.Auto);
		StartCoroutine(_coroutine);
	}

	//TODO make this work right, maybe using Events and Delegates
	IEnumerator ResetSoon()
	{
		yield return new WaitForSeconds(resetTime);
		print("revery cusror");
		Cursor.SetCursor(cursorSprites[0], _hotspot, CursorMode.Auto);
		yield return null;
	}
	
    }

and my CameraRaycaster script:

public class CameraRaycaster : MonoBehaviour
{
    public Layer[] layerPriorities = {
        Layer.NonPlayerChar,
        Layer.Enemy,
        Layer.Animal,
        Layer.Player,
        Layer.Walkable,
        Layer.Default,   
        Layer.RaycastEndStop,
    };

    public delegate void D_OnLayerChange(Layer l);
    public static event D_OnLayerChange OnLayerChange;  //event's accessor (public) must be <= delegate's


    float distanceToBackground = 1000f;
    public Camera viewCamera;

    RaycastHit _hit;

    public RaycastHit hit
    {
        get { return _hit; }
    }



    Layer _layerHit;

    public Layer layerHit
    {
        get { return _layerHit; }
    }



    void Start()    
    {
        _hit.distance = distanceToBackground;
        _layerHit = Layer.RaycastEndStop;
    }


    void Update()
    {
        if (!Input.GetMouseButtonDown(0)) return; //Only call on click

        foreach (Layer layer in layerPriorities){

            RaycastHit? __hit = RaycastForLayer(layer);

            if (__hit != null){
                _hit = (RaycastHit)__hit;
                if (_layerHit != layer){
                    _layerHit = layer;
                    OnLayerChange(layer);
                }
                return;
            }
        }

        // Otherwise return background hit
        _hit.distance = distanceToBackground;
        _layerHit = Layer.RaycastEndStop;
        OnLayerChange(Layer.RaycastEndStop);
    }

    RaycastHit? RaycastForLayer(Layer layer)
    {
        int layerMask = 1 << (int)layer; 
        Ray ray = viewCamera.ScreenPointToRay(Input.mousePosition);
        
      
        RaycastHit hit1; // used as an out parameter
        bool hasHit = Physics.Raycast(ray, out hit1, distanceToBackground, layerMask);
        if (!hasHit) return null;
        return hit1;
       
    }

}

Any help would be loved! I’ll make it up by reading through a few posts below and seeing if I can help there (which is what I always try to do when I ask for help. Help two people, get help from one, is a good ratio!).

Privacy & Terms