вы снова объявляете оружие, в локальном масштабе оно назначается, но собирается мусором, как только вы покидаете тело метода.просто замените оружейное оружие на оружие, это сообщит компилятору, что вы обращаетесь к существующей переменной, а не создаете одноразовую
Попробуйте вместо этого запустить Start
void Start()
{
var thing=GameObject.Find("Thing");
if (thing==null) Debug.Log("Thing object not found");
else
{
weapon = thing.GetComponent<Weapon>();
if (weapon==null)
Debug.Log("No weapon found on thing;
}
}