Почему мой Скелет не нанесет урон моему игроку? - PullRequest
0 голосов
/ 26 октября 2019

Итак, каждый раз, когда скелет попадает в игрока / персонажа. Это не будет показывать слово «ХИТ!». Что я сделал не так?

ИНСПЕКТОР ИЗОБРАЖЕНИЯ ИГРОКА

ИНСПЕКТОР ИЗОБРАЖЕНИЯ СКЕЛЕТА

ИЗОБРАЖЕНИЕ ИЕРАРХИИ



Скелет врага скелета



private Rigidbody2D myBody;

[Header("Movement")]
public float moveSpeed;
private float minX, maxX;
public float distance;
public int direction;

private bool patrol, detect;

private Transform playerPos;
private Animator anim;

[Header("Attack")]
public Transform attackPos;
public float attackRange;
public LayerMask playerLayer;
public int damage;

//sound

Пробуждение

void Awake()
{
    anim = GetComponent<Animator>();
    playerPos = GameObject.Find("George").transform;
    myBody = GetComponent<Rigidbody2D>();
}

ОТКРЫТЫЙ СТАРТ

private void Start()
{
    maxX = transform.position.x + (distance);
    minX = maxX - distance;

    //if (Random.value > 0.5) direction = 1;
    //else direction = -1;
}

ОБНОВЛЕНИЕ ОБНОВЛЕНИЙ

void Update()
{
    if (Vector3.Distance(transform.position, playerPos.position) <= 4.0f) patrol = false;
    else patrol = true;
}

ОБНОВЛЕНО ОБНОВЛЕНО

private void FixedUpdate()
{
    if (anim.GetBool("Death"))
    {
        myBody.velocity = Vector2.zero;
        GetComponent<Collider2D>().enabled = false;
        myBody.isKinematic = true;
        anim.SetBool("Attack", false);
        return;
    }


    if (myBody.velocity.x > 0)
    {
        transform.localScale = new Vector2(1f, transform.localScale.y);
        anim.SetBool("Attack", false);
    }
    else if
        (myBody.velocity.x < 0) transform.localScale = new Vector2(-1f, transform.localScale.y);


    if (patrol)
    {
        detect = false;
        switch (direction)
        {
            case -1:
                if (transform.position.x > minX)
                    myBody.velocity = new Vector2(-moveSpeed, myBody.velocity.y);
                else
                    direction = 1;
                break;
            case 1:
                if (transform.position.x < maxX)
                    myBody.velocity = new Vector2(moveSpeed, myBody.velocity.y);
                else
                    direction = -1;
                break;
        }
    }
    else
    {
        if (Vector2.Distance(playerPos.position, transform.position) >= 1.0f)
        {
            if (!detect)
            {
                detect = true;
                anim.SetTrigger("Detect");
                myBody.velocity = new Vector2(0, myBody.velocity.y);
            }
            if (anim.GetCurrentAnimatorStateInfo(0).IsName("Detect")) return;



            Vector3 playerDir = (playerPos.position - transform.position).normalized;

            if (playerDir.x > 0)
                myBody.velocity = new Vector2(moveSpeed + 0.4f, myBody.velocity.y);
            else
                myBody.velocity = new Vector2(-(moveSpeed + 0.4f), myBody.velocity.y);
        }
        else if (Vector2.Distance(playerPos.position, transform.position) <= 1.0)
        {
            myBody.velocity = new Vector2(0, myBody.velocity.y);
            anim.SetBool("Attack", true);
        }
    }
}

VOID ATTACK

 public void Attack()
    {
        myBody.velocity = new Vector2(0, myBody.velocity.y);

        Collider2D attackPlayer = Physics2D.OverlapCircle(attackPos.position, attackRange, playerLayer);

        if (attackPlayer == null)
        {
            if(attackPlayer.tag == "Player")
            {
                print("Hit!");
                attackPlayer.gameObject.GetComponent<PlayerHealth>().TakeDamage(damage);
            }
        }
    }
    private void OnDrawGizmosSelected()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawWireSphere(attackPos.position, attackRange);
    }


СКРИПТ ЗДОРОВЬЯ ИГРОКА



VOID AWAKE

 public int health = 100;

    void Awake()
    {

    }

VOID UPDATE

 void Update()
    {
        if (health < 1)
        {
            print("Dead");
        }    
    }

VOID TAKE DAMAGE

 public void TakeDamage(int damage)
    {
        FindObjectOfType<CameraShake>().ShakeItMedium();
        health -= damage;
    }

    private void OnTriggerEnter2D(Collider2D target)
    {
        if(target.tag == "Fireball")
        {
            TakeDamage(25);
        }
    }

Ответы [ 2 ]

0 голосов
/ 27 октября 2019

Похоже, вы не вызываете метод «Атака» в своем скрипте.

else if (Vector2.Distance(playerPos.position, transform.position) <= 1.0)
{
    myBody.velocity = new Vector2(0, myBody.velocity.y);
    // calling the attack method, so the physics cast is being made
    Attack();
    anim.SetBool("Attack", true);
}

И не забудьте изменить это, вы проверяете, что актерский состав ничего не ударил вместо чего-то.

// if the cast hit something
if (attackPlayer != null)
{
    if(attackPlayer.tag == "Player")
    {
        print("Hit!");
        attackPlayer.gameObject.GetComponent<PlayerHealth>().TakeDamage(damage);
    }
}
0 голосов
/ 27 октября 2019

Хотя может быть много других проблем с этой длинной кучей кода:

if (attackPlayer == null) { if(attackPlayer.tag == "Player") { print("Hit!"); attackPlayer.gameObject.GetComponent<PlayerHealth>().TakeDamage(damage); } }

Вы проверяете, равен ли значение attackPlayer и затем пытаетесь поработать над этим ... Я довольноВы уверены, что имели в виду if (attackPlayer != null) ...

...