Обращение к объекту
Добавлено: 19 мар 2022, 00:20
Всем привет. Такая проблема. Учусь C# на практике. Хочу реализовать врагов. Создал префаб и добавил 3 врага с тегом "Enemy". После смерти врага в его скрипте EnemyHP булевая переменная EnemyDead принимает значение true. В скрипте PatrolerEnemy через код GameObject.FindGameObjectWithTag("Enemy").GetComponent<EnemyHP>().EnemyDead проверяю жив он или нет, что бы отключить возможность двигаться. Но из-за того, что у меня несколько объектов с тегом Enemy он не может понять к какому из них обращаться.
Скрипт PatrolerEnemy
Скрипт EnemyHP
Как лучше реализовать обращение к объекту, который я уничтожил?
Скрипт PatrolerEnemy
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PatrolerEnemy : MonoBehaviour
{
public static float speed;
public int positionOfPatrol;
public Transform point;
// private Rigidbody2D rb;
bool moveingRight;
Transform player;
public float stopingDistance;
bool chill = false;
bool angry = false;
bool goBack = false;
public Animator animator;
public bool EnemyDead1;
void Start()
{
speed = 3;
// rb = GetComponent<Rigidbody2D>();
player = GameObject.FindGameObjectWithTag("Player").transform;
animator.SetFloat("Speed", speed);
EnemyDead1 = GameObject.FindGameObjectWithTag("Enemy").GetComponent<EnemyHP>().EnemyDead;
Debug.Log(EnemyDead1);
}
void Update()
{
EnemyDead1 = GameObject.FindGameObjectWithTag("Enemy").GetComponent<EnemyHP>().EnemyDead;
if (!EnemyDead1)
{//this.enabled = false;
if (Vector2.Distance(transform.position, point.position) < positionOfPatrol && angry == false)
{
chill = true;
}
if (Vector2.Distance(transform.position, player.position) < stopingDistance)
{
angry = true;
chill = false;
goBack = false;
}
if (Vector2.Distance(transform.position, player.position) > stopingDistance)
{
goBack = true;
angry = false;
}
}
if (EnemyDead1)
{
chill = false;
angry = false;
goBack = false;
}
if (chill == true && ColisionDamage.colDamage == false)
{
Chill();
}
else if (angry == true && ColisionDamage.colDamage == false)
{
Angry();
}
else if (goBack == true && ColisionDamage.colDamage == false)
{
GoBack();
}
}
void Chill()
{
speed = 3;
if (transform.position.x > point.position.x + positionOfPatrol)
{
moveingRight = false;
}
else if (transform.position.x < point.position.x - positionOfPatrol)
{
moveingRight = true;
}
if (moveingRight)
{
transform.position = new Vector2(transform.position.x + speed * Time.deltaTime, transform.position.y);
transform.localScale = new Vector2(1, 1);
}
else
{
transform.position = new Vector2(transform.position.x - speed * Time.deltaTime, transform.position.y);
transform.localScale = new Vector2(-1, 1);
}
}
void Angry()
{
transform.position = Vector2.MoveTowards(transform.position, player.position, speed * Time.deltaTime);
if (transform.position.x < player.position.x)
{
transform.localScale = new Vector2(1, 1);
}
else
{
transform.localScale = new Vector2(-1, 1);
}
speed = 4;
}
void GoBack()
{
speed = 3;
transform.position = Vector2.MoveTowards(transform.position, point.position, speed * Time.deltaTime);
if (transform.position.x < player.position.x)
{
transform.localScale = new Vector2(1, 1);
}
else
{
transform.localScale = new Vector2(-1, 1);
}
}
}
using System.Collections.Generic;
using UnityEngine;
public class PatrolerEnemy : MonoBehaviour
{
public static float speed;
public int positionOfPatrol;
public Transform point;
// private Rigidbody2D rb;
bool moveingRight;
Transform player;
public float stopingDistance;
bool chill = false;
bool angry = false;
bool goBack = false;
public Animator animator;
public bool EnemyDead1;
void Start()
{
speed = 3;
// rb = GetComponent<Rigidbody2D>();
player = GameObject.FindGameObjectWithTag("Player").transform;
animator.SetFloat("Speed", speed);
EnemyDead1 = GameObject.FindGameObjectWithTag("Enemy").GetComponent<EnemyHP>().EnemyDead;
Debug.Log(EnemyDead1);
}
void Update()
{
EnemyDead1 = GameObject.FindGameObjectWithTag("Enemy").GetComponent<EnemyHP>().EnemyDead;
if (!EnemyDead1)
{//this.enabled = false;
if (Vector2.Distance(transform.position, point.position) < positionOfPatrol && angry == false)
{
chill = true;
}
if (Vector2.Distance(transform.position, player.position) < stopingDistance)
{
angry = true;
chill = false;
goBack = false;
}
if (Vector2.Distance(transform.position, player.position) > stopingDistance)
{
goBack = true;
angry = false;
}
}
if (EnemyDead1)
{
chill = false;
angry = false;
goBack = false;
}
if (chill == true && ColisionDamage.colDamage == false)
{
Chill();
}
else if (angry == true && ColisionDamage.colDamage == false)
{
Angry();
}
else if (goBack == true && ColisionDamage.colDamage == false)
{
GoBack();
}
}
void Chill()
{
speed = 3;
if (transform.position.x > point.position.x + positionOfPatrol)
{
moveingRight = false;
}
else if (transform.position.x < point.position.x - positionOfPatrol)
{
moveingRight = true;
}
if (moveingRight)
{
transform.position = new Vector2(transform.position.x + speed * Time.deltaTime, transform.position.y);
transform.localScale = new Vector2(1, 1);
}
else
{
transform.position = new Vector2(transform.position.x - speed * Time.deltaTime, transform.position.y);
transform.localScale = new Vector2(-1, 1);
}
}
void Angry()
{
transform.position = Vector2.MoveTowards(transform.position, player.position, speed * Time.deltaTime);
if (transform.position.x < player.position.x)
{
transform.localScale = new Vector2(1, 1);
}
else
{
transform.localScale = new Vector2(-1, 1);
}
speed = 4;
}
void GoBack()
{
speed = 3;
transform.position = Vector2.MoveTowards(transform.position, point.position, speed * Time.deltaTime);
if (transform.position.x < player.position.x)
{
transform.localScale = new Vector2(1, 1);
}
else
{
transform.localScale = new Vector2(-1, 1);
}
}
}
Скрипт EnemyHP
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyHP : MonoBehaviour
{
public int maxHealth = 20;
int currentHealth;
public Animator animator;
public bool EnemyDead;
void Start()
{
currentHealth = maxHealth;
}
public void TakeDamge(int damage)
{
currentHealth -= damage;
if(currentHealth <= 0)
{
Die();
}
}
void Die()
{
PatrolerEnemy.speed = 0;
animator.SetFloat("Speed", PatrolerEnemy.speed);
Debug.Log("Enemy diad!");
EnemyDead = true;
Debug.Log(EnemyDead);
animator.SetBool("IsDead", true);
animator.Play("SlamiDie");
GetComponent<Collider2D>().enabled = false;
StartCoroutine(toDie());
//this.enabled = false;
}
IEnumerator toDie()
{
yield return new WaitForSeconds(3f);
EnemyDead = false;
Destroy(gameObject);
}
}
using System.Collections.Generic;
using UnityEngine;
public class EnemyHP : MonoBehaviour
{
public int maxHealth = 20;
int currentHealth;
public Animator animator;
public bool EnemyDead;
void Start()
{
currentHealth = maxHealth;
}
public void TakeDamge(int damage)
{
currentHealth -= damage;
if(currentHealth <= 0)
{
Die();
}
}
void Die()
{
PatrolerEnemy.speed = 0;
animator.SetFloat("Speed", PatrolerEnemy.speed);
Debug.Log("Enemy diad!");
EnemyDead = true;
Debug.Log(EnemyDead);
animator.SetBool("IsDead", true);
animator.Play("SlamiDie");
GetComponent<Collider2D>().enabled = false;
StartCoroutine(toDie());
//this.enabled = false;
}
IEnumerator toDie()
{
yield return new WaitForSeconds(3f);
EnemyDead = false;
Destroy(gameObject);
}
}
Как лучше реализовать обращение к объекту, который я уничтожил?