Hello, the game is 2d topdown horizontal and vertical movement, just to get an idea. My PlayerAttack.cs script now works to target only one enemy at a time, and you can’t change target. So it’s predetermined from the get-go, and then automatically assigns me a new enemy, which is the only one I can hit. Obviously, I want to be able to move around attacking whomever I want.
Relevant code:
private GameObject target
[...]
private void MeleeAttack(){
target = GameObject.FindGameObjectWithTag("Enemy");
float distance = Vector3.Distance(target.transform.position, transform.position);
if(distance <1.5f){
EnemyHealth eh = (EnemyHealth)target.GetComponent("EnemyHealth");
eh.curhp -= 10;
Debug.Log ("You whacked an enemy for 10hp");
}
}
I’m thinking I have to implement a list, using “FindGameObjectsWithTag(“Enemy”);” with a GameObject or something. But, I have issues figuring out the syntax semantics. Any help would be greatly appreciated, thanks!
Under the course of the day, I found a solution that worked for me. The code was adjusted quite a bit, but I am going to post my entire PlayerAttack.cs script so other people can find an answer later, if they stumble upon something similar to what I did, personally.
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class PlayerAttack3 : MonoBehaviour {
private float attackTimer;
private float cd;
private Animator m_Animator;
public bool isAttacking = false;
GameObject FindClosestEnemy() {
GameObject[] gos;
gos = GameObject.FindGameObjectsWithTag("Enemy");
GameObject closest = null;
float distance = Mathf.Infinity;
Vector3 position = transform.position;
foreach (GameObject enemy in gos) {
Vector3 diff = enemy.transform.position - position;
float curDistance = diff.sqrMagnitude;
if (curDistance < distance) {
closest = enemy;
distance = curDistance;
}
}
return closest;
}
void Example() {
print (FindClosestEnemy().name);
}
void Start() {
attackTimer = 2;
cd = 0.5f;
m_Animator = GetComponent<Animator>();
}
void LateUpdate() {
m_Animator.SetBool("IsAttacking", isAttacking);
if(attackTimer > 0) {
attackTimer -= Time.deltaTime;
}
if(attackTimer < 0) {
attackTimer = 0;
}
GameObject target = FindClosestEnemy();
if(Input.GetButtonDown("Fire1")){
if(attackTimer == 0) {
isAttacking = true;
attackTimer = cd;
EnemyHealth2 eh = (EnemyHealth2)target.GetComponent("EnemyHealth2");
eh.curhp -= 10;
Debug.Log ("You whacked enemy for 10hp");
if(eh.curhp <= 0) {
Destroy (eh.gameObject);
}
}
}
else {
isAttacking = false;
}
}
}
I hope it can be of help to anyone in the future. Keep on coding!