0

У меня есть персонаж, который умеет двигаться и прыгать, проблемы возникли, когда я попытался научить его атаковать. Я прикрепил к персонажу объект с Circle.Collider2D и пробовал сделать так, чтобы персонаж атаковал при нажатии ЛКМ и наносил урон если в области объекта есть враг.

Скрипт персонажа:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerHit : MonoBehaviour
{
public bool canHit;
public static int damage;
public EnemyHp enemyhp;

void Start()
{
    damage = 10;
}

private void Awake()
{

}

void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        if (canHit)
        {
            enemyhp.takeDamage(damage);
        }
    }
}

private void OnTriggerEnter2D(Collider2D collision)
{
    canHit = true;
}

private void OnTriggerExit2D(Collider2D collision)
{
    canHit = false;
}
}

Скрипт объекта на персонаже:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RotateCircle : MonoBehaviour
{
public CircleCollider2D circle;

void Start()
{

}

private void Awake()
{
    circle.GetComponentInChildren<CircleCollider2D>();
}

void Update()
{
    if (Input.GetKey(KeyCode.A)){
        circle.transform.rotation = Quaternion.Euler(0, 180, 0);
    }
    if (Input.GetKey(KeyCode.D))
    {
        circle.transform.rotation = Quaternion.Euler(0, 0, 0);
    }
}
}

Скрипт врага:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyHp : MonoBehaviour
{
public int maxHealth = 100;
public int curHealth = 100;
public BoxCollider2D box;
void Start()
{

}

private void Awake()
{
    box.GetComponent<BoxCollider2D>();
}

void Update()
{

}

public void takeDamage(int damage)
{
    curHealth -= damage;
    if (curHealth <= 0)
    {
        curHealth = 0;
        Debug.Log("Dead");
        Destroy(gameObject);
    }
    Debug.Log(curHealth);
}
}

Мне необходимо, чтобы при нажатии ЛКМ персонаж атаковал всех врагов в радиусе Circle.Collider2D. Приведите пример кода, либо объясните, что мне нужно сделать, чтобы реализовать задуманное.

Как я понимаю, все мои трудности идут из-за плохого понимания c#. Подскажите, пожалуйста, книги/курсы для людей со знанием этого языка на уровне "чуть выше синтаксиса".

  • у этого чувака есть довольно неплохие видео как по шарпу в целом так и по юнити в частности https://www.youtube.com/channel/UCgIOz3pWYO1ql5x1Qq3lcSQ Но на английском. В целом -- советую. – Andrew Stop_RU_war_in_UA Jan 25 '19 at 20:03
  • А так же: https://ru.stackoverflow.com/questions/609900/%d0%9a%d0%bd%d0%b8%d0%b3%d0%b8-%d0%b8-%d1%83%d1%87%d0%b5%d0%b1%d0%bd%d1%8b%d0%b5-%d1%80%d0%b5%d1%81%d1%83%d1%80%d1%81%d1%8b-%d0%bf%d0%be-unity3d – Andrew Stop_RU_war_in_UA Jan 25 '19 at 20:38

1 Answers1

0

Повесь на меч отдельный коллайдер с тэгом Weapon. На врагу на вызове OnCollisionEnter() проверяй тэг обьекта и отнимай жизни.

Здесь есть похожий вопрос, только про огнестрельное оружие. Но у тебя бутет подход тот же:

Unity3D обращение к одинаковым переменным int в разных скриптах, при условии что у каждого gameObject есть только 1 скрипт

  • Плохой ответ. Во-первых, зачем тэги, если можно поправить матрицу коллизий, что ускорит физический движок и позволит не нагружать цп лишними проверками. Во-вторых, зачем вообще куда-то вешать коллайдер, если ключевое событие здесь - нажатие какой-то кнопки? Лишние ресурсы, которые ну ничего принципиально уникального не преподносят. –  Jan 26 '19 at 09:21