Unity2D. Метод "OnTriggerEnter2D" не работает на сборных - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть одна проблема, я не запускаю метод "OnTriggerEnter2D" в префабе. Я взял объект, набросал на него скрипт, добавил нужные компоненты и сделал его готовым. У меня есть герой, когда он атакует коллайдер, который является спусковым крючком. Если этот коллайдер является мечом игрока, то враг получает урон. Обычный объект (не префаб) поврежден, но если я сделаю этот объект префабом и перетащу его на сцену, то метод «OnTriggerEnter2D» не будет работать. Вот вражеский сценарий. Я также вылил свой проект на Github, для лучшего понимания. Я буду очень благодарен за помощь, потому что я не мог понять причину. Мой проект - https://github.com/OleksandrKupchuk/SimpleGame

//Enemy Archer
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyArcher : EnemyBase
{
[SerializeField] GameObject arrowPrefab;
[SerializeField] Transform startPositionArrow;

public override void Start()
{
    base.Start();
    ChangeStateEnemy(new IdleState());
}

public new void Update()
{
    //ChangeState(currentState);
    StateEnemy();
}

private void StateEnemy()
{
    currentState.Execute();
}

public override void Attack()
{
    timeAttack += Time.deltaTime;

    enemyAnimator.SetFloat("animatorEnemyRun", 0);

    if (timeAttack >= delayAttack)
    {
        CanAttack = true;
        timeAttack = 0;
    }

    if (CanAttack)
    {
        enemyAnimator.SetTrigger("animatorEnemyAttack");
        CanAttack = false;
    }
}

public void FireArrow()
{
    if (facingRight)
    {
        enemyAnimator.SetTrigger("animatorEnemyAttack");
        GameObject arrow = Instantiate(arrowPrefab, startPositionArrow.position, Quaternion.identity);
        arrow.GetComponent<EnemyArrowMove>().ArrowInitialization(Vector2.right);
    }

    else
    {
        GameObject arrow = Instantiate(arrowPrefab, startPositionArrow.position, Quaternion.Euler(new Vector3(0f, 180f, 0f)));
        arrow.GetComponent<EnemyArrowMove>().ArrowInitialization(Vector2.left);
    }
}

private void OnTriggerEnter2D(Collider2D collision)
{
    if (collision.CompareTag("PlayerSword"))
    {
        Debug.Log("Take");
        TakeDamage();
        EnemyTarget = collision.gameObject;
    }
}
}

//////

//Enemy Base
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(Rigidbody2D))]
[RequireComponent(typeof(Animator))]
[RequireComponent(typeof(BoxCollider2D))]
[RequireComponent(typeof(CircleCollider2D))]
public class EnemyBase : CharacterBase
{
public IStateEnemy currentState;

protected float timeAttack;
[SerializeField] protected float delayAttack;

public bool CanAttack { get; set; }

protected float dirPlayer;
public GameObject EnemyTarget { get; set; }

[SerializeField] protected float enemyRangeAttack;

[SerializeField] int experienceForTheEnemy;

public bool EnemyRangeAttack
{
    get
    {
        if (EnemyTarget != null)
        {
            if (Vector2.Distance(EnemyTarget.transform.position, transform.position) <= enemyRangeAttack)
            {
                return true;
            }
        }

        return false;
    }
}

public bool EnemyOutsideEdge
{
    get
    {
        if(transform.position.x >= rightEdge.position.x || transform.position.x <= leftEdge.position.x)
        {
            return true;
        }

        return false;
    }
}

//edges for enemy
[SerializeField] protected Transform leftEdge;
[SerializeField] protected Transform rightEdge;

public bool EnemyDie 
{
    get
    {
        if(health <= 0)
        {
            return true;
        }

        return false;
    }
}
[SerializeField] EdgeCollider2D enemySword;

[SerializeField] private Rigidbody2D enemyRigidbody;
public Rigidbody2D EnemyRigidbody { get => enemyRigidbody; set => enemyRigidbody = value; }

public Animator enemyAnimator;

[SerializeField] int takeDamage;

public bool EnemyAttack { get; set; }

public bool EnemyHit { get; set; }
protected float directionEnemy;

public override void Start()
{
    base.Start();
    enemyAnimator = GetComponent<Animator>();
}

public void Update()
{

}

public void TakeDamage()
{
    if (!EnemyDie)
    {
        enemyAnimator.SetTrigger("animatorEnemyHit");
        health -= takeDamage;

        if (health <= 0)
        {
            enemyAnimator.SetTrigger("animatorEnemyDie");
            Destroy(gameObject, 1.5f);
            Player.PlayerInstance.AddIndicatorForPlayer(experienceForTheEnemy);
        }
    }
}

public void EnemySwordEnabled()
{
    enemySword.enabled = true;
}

public void EnemySwordDisabled()
{
    enemySword.enabled = false;
}

public void Flip()
{
    //Debug.Log("Flip");
    facingRight = !facingRight;
    transform.localScale = new Vector2(transform.localScale.x * -1, transform.localScale.y);
    //transform.Rotate(0f, 180f, 0f);
}

public void Walk()
{
    if (!EnemyAttack && !EnemyDie && !EnemyHit)
    {
        if ((ChangeSide().x > 0 && transform.position.x < rightEdge.position.x) || (ChangeSide().x < 0 && transform.position.x > leftEdge.position.x))
        {
            enemyAnimator.SetFloat("animatorEnemyRun", 1);
            transform.Translate(ChangeSide() * speed * Time.deltaTime);
        }
    }
}

public Vector2 ChangeSide()
{
    if (facingRight)
    {
        return Vector2.right;
    }

    return Vector2.left;
}

public void ChangeDirection()
{
    if (transform.position.x >= rightEdge.position.x || transform.position.x <= leftEdge.position.x)
    {
        Flip();
    }
}

public void EnemyLookTarget()
{
    if (!EnemyDie && EnemyTarget != null)
    {
        directionEnemy = EnemyTarget.transform.position.x - transform.position.x;
        if (directionEnemy < 0 && facingRight || directionEnemy > 0 && !facingRight)
        {
            Flip();
        }
    }
}

public virtual void Attack()
{
    timeAttack += Time.deltaTime;

    //enemyAnimator.SetFloat("animatorEnemyRun", 0);

    if (timeAttack >= delayAttack)
    {
        CanAttack = true;
        timeAttack = 0;
    }

    if (CanAttack)
    {
        enemyAnimator.SetTrigger("animatorEnemyAttack");
        CanAttack = false;
    }
}

public void ChangeStateEnemy(IStateEnemy newState)
{
    currentState = newState;

    currentState.Enter(this);
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...