I have been going through the RPG Combat course. I am partway through Equipping a Weapon.
I am finding that I get the following error when running the Game:
UnassignedReferenceException: The variable weaponPrefab of Fighter has not been assigned.
You probably need to assign the weaponPrefab variable of the Fighter script in the inspector.
I have attached an image showing that I have the Inspector properties setup ok.
I am not really sure how to fix this.
The game appears to run ok, the player moves, the sword moves with his hand, but I am worried that the error will be an issue later.
The sword is actually assigned to the player:
Here is the version of the Fighter script:
using UnityEngine;
using RPG.Movement;
using RPG.Core;
namespace RPG.Combat
{
public class Fighter : MonoBehaviour, IAction
{
[SerializeField] float weaponRange = 2f;
[SerializeField] float timeBetweenAttacks = 1f;
[SerializeField] float weaponDamage = 5f;
[SerializeField] GameObject weaponPrefab = null;
[SerializeField] Transform handTransform = null;
Health target;
float timeSinceLastAttack = Mathf.Infinity;
private void Start()
{
SpawnWeapon();
}
private void Update()
{
timeSinceLastAttack += Time.deltaTime;
if(target == null) return;
if(target.IsDead()) return;
if (!GetIsInRange())
{
GetComponent<Mover>().MoveTo(target.transform.position, 1f);
}
else
{
GetComponent<Mover>().Cancel();
AttackBehaviour();
}
}
private void SpawnWeapon()
{
Instantiate(weaponPrefab, handTransform);
}
private void AttackBehaviour()
{
transform.LookAt(target.transform);
if(timeSinceLastAttack > timeBetweenAttacks)
{
// This will trigger the Hit() event.
TriggerAttack();
timeSinceLastAttack = 0;
}
}
private void TriggerAttack()
{
GetComponent<Animator>().ResetTrigger("stopAttack");
GetComponent<Animator>().SetTrigger("attack");
}
// Animation Event
void Hit()
{
if(target == null) { return; }
target.TakeDamage(weaponDamage);
}
private bool GetIsInRange()
{
return Vector3.Distance(transform.position, target.transform.position) < weaponRange;
}
public bool CanAttack(GameObject combatTarget)
{
if (combatTarget == null) { return false; }
Health targetToTest = combatTarget.GetComponent<Health>();
return targetToTest != null && !targetToTest.IsDead();
}
public void Attack(GameObject combatTarget)
{
GetComponent<ActionScheduler>().StartAction(this);
target = combatTarget.GetComponent<Health>();
}
public void Cancel()
{
StopAttack();
target = null;
GetComponent<Mover>().Cancel();
}
private void StopAttack()
{
GetComponent<Animator>().ResetTrigger("attack");
GetComponent<Animator>().SetTrigger("stopAttack");
}
}
}
AAAh I just noticed the Instructor also has this issue. so it must be something they fix in the future!