loliks2D
(Александр)
16.Сентябрь.2021 18:52:44
#1
я хочу чтоб когда условный Enemy дотрагивался до объекта с тегом player он наносид ему урон и это делают строчки ниже, но проблема в том что сносится только два оно сносит с 10 до 8 и всё
private void OnTriggerStay2D(Collider2D other)
{
if (other.CompareTag("Player"))
{
if (TimeBtwAttack <= 0)
{
anim.SetTrigger("IsAttack");
}
else
{
TimeBtwAttack -= Time.deltaTime;
}
}
}
public void OnEnnemyAttack()
{
player.health -= damage;
TimeBtwAttack = StartTimeBtwAttack;
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Enemy : MonoBehaviour
{
public float Speed;
private float TimeBtwAttack;
public float StartTimeBtwAttack;
public int damage;
public int healt;
private Transform target;
private Tower player;
private float StartPosX;
private float StartPosY;
private bool isBeingHeld = false;
private Animator anim;
private void Start()
{
target = GameObject.FindGameObjectWithTag("Player").GetComponent<Transform>();
player = FindObjectOfType<Tower>();
anim = GetComponent<Animator>();
}
void Update()
{
if (isBeingHeld == true)
{
Vector3 mousePos;
mousePos = Input.mousePosition;
mousePos = Camera.main.ScreenToWorldPoint(mousePos);
this.gameObject.transform.localPosition = new Vector3(mousePos.x - StartPosX, mousePos.y - StartPosY, 0);
}
transform.position = Vector2.MoveTowards(transform.position, target.position, Speed * Time.deltaTime);
}
private void OnTriggerStay2D(Collider2D other)
{
if (other.CompareTag("Player"))
{
if (TimeBtwAttack <= 0)
{
anim.SetTrigger("IsAttack");
}
else
{
TimeBtwAttack -= Time.deltaTime;
}
}
}
public void OnEnnemyAttack()
{
player.health -= damage;
TimeBtwAttack = StartTimeBtwAttack;
}
private void OnMouseDown()
{
if (Input.GetMouseButtonDown(0))
{
Vector3 mousePos;
mousePos = Input.mousePosition;
mousePos = Camera.main.ScreenToWorldPoint(mousePos);
StartPosX = mousePos.x - this.gameObject.transform.localPosition.x;
StartPosY = mousePos.y - this.gameObject.transform.localPosition.y;
isBeingHeld = true;
}
}
private void OnMouseUp()
{
isBeingHeld = false;
}
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.CompareTag("Wall"))
{
Destroy(gameObject);
}
}
}
AlexP
(Alex P.)
16.Сентябрь.2021 19:42:12
#2
А OnEnnemyAttack
это откуда, чем вызывается?
loliks2D
(Александр)
17.Сентябрь.2021 12:38:04
#3
Это вызвано через анимацию , там я добавил событие и выбрал функцию OnEnemyAttack()
loliks2D
(Александр)
17.Сентябрь.2021 13:45:45
#4
Может что-то с анимациями не так?
AlexP
(Alex P.)
17.Сентябрь.2021 14:53:20
#5
Так а добавлено как?
И для начала стоит добавить Debug.Log
, чтобы узнать вызывается ли OnTriggerStay2D
больше 1 раза, срабатывает ли сравнение тега, правильно ли меняется время.
loliks2D
(Александр)
17.Сентябрь.2021 16:32:52
#6
есть определённая анимация attack она срабатывает из за этих строк
if (TimeBtwAttack <= 0)
{
anim.SetTrigger("IsAttack");
}
включается тригер IsAttack и из анимации idle переходит к анимации attack и в самой анимации attack есть event с методом OnEnemyAttack
loliks2D
(Александр)
17.Сентябрь.2021 16:40:51
#7
Debug.Log сработал вообще 1 раз
loliks2D
(Александр)
17.Сентябрь.2021 16:43:11
#8
но если я отодвину enemy и он опять дотронется , то Debug.Log работает
AlexP
(Alex P.)
17.Сентябрь.2021 16:54:26
#9
1 раз где именно? Весь OnTriggerStay2D
или только условие про анимацию? Надо ж везде Debug.Log
добавить, чтоб понять что происходит )
loliks2D
(Александр)
17.Сентябрь.2021 17:22:02
#12
немного исправил код сделал Debug.Log через анимацию Debug работает 3 раза
loliks2D
(Александр)
17.Сентябрь.2021 18:33:31
#13
кстати я ещё сделал так
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Enemy : MonoBehaviour
{
public float Speed;
private float TimeBtwAttack;
public float StartTimeBtwAttack;
public int damage;
public int healt;
private Transform target;
private Tower player;
private float StartPosX;
private float StartPosY;
private bool isBeingHeld = false;
private Animator anim;
private void Start()
{
target = GameObject.FindGameObjectWithTag("Player").GetComponent<Transform>();
player = FindObjectOfType<Tower>();
anim = GetComponent<Animator>();
}
void Update()
{
if (isBeingHeld == true)
{
Vector3 mousePos;
mousePos = Input.mousePosition;
mousePos = Camera.main.ScreenToWorldPoint(mousePos);
this.gameObject.transform.localPosition = new Vector3(mousePos.x - StartPosX, mousePos.y - StartPosY, 0);
}
transform.position = Vector2.MoveTowards(transform.position, target.position, Speed * Time.deltaTime);
}
private void OnTriggerStay2D(Collider2D other)
{
if (other.CompareTag("Player"))
{
if (TimeBtwAttack <= 0)
{
OnEnnemyAttack();
}
else
{
TimeBtwAttack -= Time.deltaTime;
}
}
}
public void OnEnnemyAttack()
{
Debug.Log("Coll");
}
private void OnMouseDown()
{
if (Input.GetMouseButtonDown(0))
{
Vector3 mousePos;
mousePos = Input.mousePosition;
mousePos = Camera.main.ScreenToWorldPoint(mousePos);
StartPosX = mousePos.x - this.gameObject.transform.localPosition.x;
StartPosY = mousePos.y - this.gameObject.transform.localPosition.y;
isBeingHeld = true;
}
}
private void OnMouseUp()
{
isBeingHeld = false;
}
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.CompareTag("Wall"))
{
Destroy(gameObject);
}
}
}
чтобы посмотреть проблема в анимке или нет, debug работает но потом останавливается
AlexP
(Alex P.)
17.Сентябрь.2021 21:43:30
#14
Это как?
Ну и я ж говорю
private void OnTriggerStay2D(Collider2D other)
{
Debug.Log("OnTriggerStay2D");
if (other.CompareTag("Player"))
{
Debug.Log("Triggered on Player. TimeBtwAttack: " + TimeBtwAttack);
if (TimeBtwAttack <= 0)
{
Debug.Log("Attack");
OnEnnemyAttack();
}
else
{
TimeBtwAttack -= Time.deltaTime;
}
}
}
loliks2D
(Александр)
18.Сентябрь.2021 06:48:57
#15
проблема решена, у RigidBody2D в Sleeping Mode надо поставить Never Sleep чтоб RigidBody не уходил в сон и работал