When you start a coroutine by providing the method name as a string, then the Unity engine uses [reflection][1] to find the method at runtime, which doesn't care about the visibility of methods. If you would prefer proper software engineering principles - like names being resolved at compile-time and visibility rules being respected - use [the variant of StartCoroutine which takes an IEnumerator instead of a string][2] to denote the method. WinDialogue dialogue = _winDialogue.GetComponent<WinDialogue>() dialogue.StartCoroutine(dialogue.ActivateStars(starCount)); This will give you a compile-time error if `WinDialogue.ActivateStars` is private (or does not return an IEnumerator... or gets called with the wrong arguments... or is misspelled...). [1]: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/reflection [2]: https://docs.unity3d.com/ScriptReference/MonoBehaviour.StartCoroutine.html