Need Help With Collider Script.

This script is missing some stuff because i’ve been deleting and changing things so if something isn’t being used just ignore it for now but my question is why are my Debugs not working. The arrow gameobjects are clearly passing through the triggers but nothings happening.

This script is placed on Arrows which then move up through triggers.

using UnityEngine;
using System.Collections;

public class RhythmGameArrows : MonoBehaviour {

	public float moveSpeed = 2.5f;
	public GameObject thisArrow;
	public AudioClip chime;

	void Start()
	{
		thisArrow = this.gameObject;
	}

	void Update () 
	{
		transform.Translate(Vector3.up*moveSpeed * Time.deltaTime, Space.World);
		StartCoroutine(kill ());
	}

	void OnTriggerStay(Collider other)
	{
		if(other.tag == "farLeftCatcher" && thisArrow.tag == "leftArrow")
		{
			Debug.Log("Hit");
			if(Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.LeftArrow))
			{
				good ();
			}
		}
		else if(other.tag == "leftCatcher" && thisArrow.tag == "upArrow")
		{
			Debug.Log("Hit");
			if(Input.GetKeyDown(KeyCode.W) || Input.GetKeyDown(KeyCode.UpArrow))
			{
				good ();
			}
		}
		else if(other.tag == "farRightCatcher" && thisArrow.tag == "rightArrow")
		{
			Debug.Log("Hit");
			if(Input.GetKeyDown(KeyCode.D) || Input.GetKeyDown(KeyCode.RightArrow))
			{
				good ();
			}
		}
		else if(other.tag == "rightCatcher" && thisArrow.tag == "downArrow")
		{
			Debug.Log("Hit");
			if(Input.GetKeyDown(KeyCode.S) || Input.GetKeyDown(KeyCode.DownArrow))
			{
				good ();
			}
		}

	}
	void good()
	{
		GetComponent<AudioSource>().PlayOneShot(chime);
		PlayerPrefs.SetInt("Cash", PlayerPrefs.GetInt("Cash") + 1);
		Destroy(gameObject);
	}

	private IEnumerator kill()
	{
		yield return new WaitForSeconds(2);
		Destroy(gameObject);
	}
}

Make sure you are using the right tags on the triggers and on the arrow.

Suggestions:

Instead of doing this (other.GetComponent().tag ) several times you should just call other.tag, because other is already a collider.

Instead of doing if, if, if, if… you should use if, else if, else if… Unless it is possible to enter all the ifs on just one loop.

And try to respect the naming conventions, a method named good isnt a good approach.

Make sure you have a Rigidbody on the arrows, otherwise there’s no physics happening for the colliders to trigger from. You can also add a Debug.Log(other.tag) to the top of the OnTriggerStay() method to make sure it’s at least seeing something.

A few other things:

The thisArrow variable is redundant since you can just use gameObject.tag.

The StartCoroutine() should be in the Start() method so it’s not getting started every frame. An alternative is to do this in Start():

Destroy(gameObject, 2f);

This will destroy the object after 2 seconds without needing a separate method.