Question by
Omirserik · Jul 15, 2020 at 04:35 PM ·
animationmovementanimator controllercharacter controllerclick to move
Hey. I wanted to create RTS character controller, for some reason my character cannot move in the scene and animations clash. I also want to add gathering animation(code)
public TaskList task;
public NodeManager.ResourceTypes heldResourceType;
public ResourceManager RM;
public bool isGathering;
public int heldResource;
public int maxHeldResource;
public GameObject[] drops;
private ActionList AL;
private Animator mAnimator;
private bool mRunning = false;
private NavMeshAgent mNaveMeshAgent;
GameObject targetNode;
void Start()
{
mAnimator = GetComponent<Animator>();
mNaveMeshAgent = GetComponent<NavMeshAgent>();
StartCoroutine(GatherTick());
AL = FindObjectOfType<ActionList>();
}
void Update()
{
if (targetNode == null)
{
if (heldResource != 0)
{
drops = GameObject.FindGameObjectsWithTag("Drops");
mNaveMeshAgent.destination = GetClosestDropOff(drops).transform.position;
drops = null;
task = TaskList.Delivering;
}
else
{
task = TaskList.Idle;
}
}
if (heldResource >= maxHeldResource)
{
drops = GameObject.FindGameObjectsWithTag("Drops");
mNaveMeshAgent.destination = GetClosestDropOff(drops).transform.position;
drops = null;
task = TaskList.Delivering;
}
if (Input.GetMouseButtonDown(1) && GetComponent<Player>().isSelected)
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 100))
{
if(hit.collider.tag == "GroundLayer")
{
AL.Move(mNaveMeshAgent, hit);
task = TaskList.Moving;
}
else if (hit.collider.tag == "Resource")
{
AL.Move(mNaveMeshAgent, hit);
targetNode = hit.collider.gameObject;
task = TaskList.Gahtering;
}
}
if (mNaveMeshAgent.remainingDistance <= mNaveMeshAgent.stoppingDistance)
{
mRunning = false;
}
else
{
mRunning = true;
}
mAnimator.SetBool("running", mRunning);
}
}
GameObject GetClosestDropOff(GameObject[] dropOffs)
{
GameObject closestDrop = null;
float closestDistance = Mathf.Infinity;
Vector3 position = transform.position;
foreach (GameObject targetDrop in dropOffs)
{
Vector3 direction = targetDrop.transform.position - position;
float distance = direction.sqrMagnitude;
if(distance < closestDistance)
{
closestDistance = distance;
closestDrop = targetDrop;
}
}
return closestDrop;
}
public void OnTriggerEnter(Collider other)
{
GameObject hitObject = other.gameObject;
if (hitObject.tag == "Resource" && task == TaskList.Gahtering)
{
isGathering = true;
hitObject.GetComponent<NodeManager>().beingGathered++;
heldResourceType = hitObject.GetComponent<NodeManager>().resourceType;
}
else if(hitObject.tag == "Drops" && task == TaskList.Delivering)
{
if(RM.energy >= RM.maxEnergy)
{
task = TaskList.Idle;
}
else
{
RM.energy += heldResource;
heldResource = 0;
task = TaskList.Gahtering;
mNaveMeshAgent.destination = targetNode.transform.position;
}
}
}
public void OnTriggerExit(Collider other)
{
GameObject hitObject = other.gameObject;
if (hitObject.tag == "Resource")
{
hitObject.GetComponent<NodeManager>().beingGathered--;
isGathering = false;
}
}
IEnumerator GatherTick()
{
while (true)
{
yield return new WaitForSeconds(1);
if (isGathering)
{
heldResource++;
}
}
}
}
Comment