Добрый день. Я новичок в unity, только начинаю осваивать движок и C#. Делаю пиксельный 2д top down. Нарисовал спрайты, всё сделал. Написал коды для Игрока и врага. Враг преследует и атакует нормально, а вот сам персонаж-игрок не очень. Когда ставлю игроку урон-1 , то в игре он бьёт не по 1 урону. Иногда бьёт как надо, по одному, ну или сколько я поставлю, а иногда в два раза больше, хотя я задавал другое число. Не могу понять почему его урон рандомно меняется??!!!
Так чтобы кто-то кроме вас получил шанс понять это — надо хотя бы код относящийся к вопросу выложить )
Вот код атаки игрока
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerAttack : MonoBehaviour
{
private float timeBtwAttack;
public float startTimeBtwAttack;
public Transform attackPos;
public LayerMask enemy;
public float attackRange;
public int damage;
public Animator anim;
private void Update()
{
if(timeBtwAttack <= 0)
{
if (Input.GetMouseButton(0))
{
anim.SetTrigger("attack");
timeBtwAttack = startTimeBtwAttack;
}
}
else
{
timeBtwAttack -= Time.deltaTime;
}
}
public void OnAttack()
{
Collider2D[] enemies = Physics2D.OverlapCircleAll(attackPos.position, attackRange, enemy);
for (int i = 0; i < enemies.Length; i++)
{
enemies[i].GetComponent<Enemy>().TakeDamage(damage);
}
}
private void OnDrawGizmosSelected()
{
Gizmos.color = Color.red;
Gizmos.DrawWireSphere(attackPos.position, attackRange);
}
}
Вот код самого персонажа
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class Player : MonoBehaviour
{
public ControlType controlType;
public Joystick joystick;
public float speed;
public float health;
public enum ControlType{PC, Android}
private Rigidbody2D rb;
private Vector2 moveInput;
private Vector2 moveVelocity;
private Animator anim;
private bool facingRight = true;
void Start()
{
rb = GetComponent<Rigidbody2D>();
anim = GetComponent<Animator>();
}
void Update()
{
if(controlType == ControlType.PC)
{
moveInput = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));
}
else if(controlType == ControlType.Android)
{
moveInput = new Vector2(joystick.Horizontal, joystick.Vertical);
}
moveVelocity = moveInput.normalized * speed;
if(moveInput.x + moveInput.y == 0)
{
anim.SetBool("isRunning", false);
}
else
{
anim.SetBool("isRunning", true);
}
if (!facingRight && moveInput.x > 0)
{
Flip();
}
else if (facingRight && moveInput.x < 0)
{
Flip();
}
if(health <= 0)
{
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
}
}
void FixedUpdate()
{
rb.MovePosition(rb.position + moveVelocity * Time.fixedDeltaTime);
}
private void Flip()
{
facingRight = !facingRight;
Vector3 Scaler = transform.localScale;
Scaler.x *= -1;
transform.localScale = Scaler;
}
}
Раз проблема с
то видимо в первую очередь надо смотреть в
кода которого тут нет (
Я делал по видео уроку. Там всё работает. Поясните пожалуйста что писать и куда, потому что я ещё вообще толком не понимаю
Так а в TakeDamage
и Enemy
что?
В смысле?
Так выше ж написано. Код TakeDamage
(и Enemy
) тут не выложен.
TakeDamage нету, а Enemy вот
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Enemy : MonoBehaviour
{
private float timeBtwAttack;
public float startTimeBtwAttack;
public int health;
public float speed;
public int damage;
private float stopTime;
public float startStopTime;
public float normalSpeed;
private Player player;
private Animator anim;
private void Start()
{
anim = GetComponent<Animator>();
player = FindObjectOfType<Player>();
normalSpeed = speed;
}
private void Update()
{
if(stopTime <= 0)
{
speed = normalSpeed;
}
else
{
speed = 0;
stopTime -= Time.deltaTime;
}
if(health <= 0)
{
Destroy(gameObject);
}
if(player.transform.position.x > transform.position.x)
{
transform.eulerAngles = new Vector3(0, 180, 0);
}
else
{
transform.eulerAngles = new Vector3(0, 0, 0);
}
transform.position = Vector2.MoveTowards(transform.position, player.transform.position, speed * Time.deltaTime);
}
public void TakeDamage(int damage)
{
stopTime = startStopTime;
health -= damage;
}
public void OnTriggerStay2D(Collider2D other)
{
if (other.CompareTag("Player"))
{
if(timeBtwAttack <= 0)
{
anim.SetTrigger("enemyAttack");
}
else
{
timeBtwAttack -= Time.deltaTime;
}
}
}
public void OnEnemyAttack()
{
player.health -= damage;
timeBtwAttack = startTimeBtwAttack;
}
}
Как нету если вот он?
Может быть на врагах висит несколько коллайдеров и тут несколько раз находится один объект?
Проверить это можно например добавив логирование.
for (int i = 0; i < enemies.Length; i++)
{
Debug.Log(enemies[i]);
Может быть на врагах висит несколько коллайдеров и тут несколько раз находится один объект?
Да, на противнике висит два коллайдера, но один круглый для радиуса атаки. Стоит галочка is trigger
О, всё. Отключил второй коллайдер и всё заработало нормально!