Пятница, 26 Апреля 2024, 22:20

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Стрельба только по игроку
Стрельба только по игроку
DekSterДата: Среда, 03 Октября 2018, 21:03 | Сообщение # 1
был не раз
Сейчас нет на сайте
Здравствуйте, создал скрипт пули и для стреляющих врагов, но выстрел происходит как по игроку так и по своим. как можно реализовать чтобы враги не убивали своих?
Код на пули
Код

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

public class Bullet : MonoBehaviour
{
    private GameObject parent;
    public GameObject Parent { set { parent = value; } }

    private float speed = 30.0F;
    private Vector3 direction;
    public Vector3 Direction { set { direction = value; } }
    public float shootingRate = 0.25f;
    private float shootCooldown;
    

    private SpriteRenderer sprite;

    private void Awake()
    {
        sprite = GetComponentInChildren<SpriteRenderer>();
    }

    private void Start()
    {
        shootCooldown = 0f;
        {
            shootCooldown = 0f;
        }
        Destroy(gameObject, 0.5F);
    }
    private void OnTriggerEnter2D(Collider2D collider)
    {
        if (collider.tag == "Ground")
        {
            Destroy(gameObject);
        }
        {
            Unit unit = collider.GetComponent<Unit>();

            if (unit && unit.gameObject != parent)
            {
                unit.ReceiveDamage();
                Destroy(gameObject);
            }
        }
    }
    
    private void Update()
    {

        transform.position = Vector3.MoveTowards(transform.position, transform.position + direction, speed * Time.deltaTime);
        if (shootCooldown > 0)
        {
            shootCooldown -= Time.deltaTime;
        }
    }

   
   
    }



Код на стреляющего врага
Код

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

public class ShootableMonster : Monster
{
    [SerializeField]
    private float rate = 2.0F;
    private Bullet bullet;

    protected override void Awake()
    {
        bullet = Resources.Load<Bullet>("Bullet");
    }

    protected override void Start()
    {
        InvokeRepeating("Shoot", rate, rate);
    }

    private void Shoot()
    {
      
    Vector3 position = transform.position;
        position.y += 0.4F;

        Bullet newBullet = Instantiate(bullet, position, bullet.transform.rotation) as Bullet;
        newBullet.Parent = gameObject;
        newBullet.Direction = -newBullet.transform.right;

        Collider2D collider = GetComponent<Collider2D>();

        if (collider.tag == "player")
        {
            ReceiveDamage();
        }
    }

    protected override void OnTriggerEnter2D(Collider2D collider)
   
    {
        Unit unit = collider.GetComponent<Unit>();

        if (unit && unit is Character)
        {
            if (Mathf.Abs(unit.transform.position.x - transform.position.x) < 0.3F) ReceiveDamage();
            else unit.ReceiveDamage();
        }
       
    }
}
zitДата: Среда, 03 Октября 2018, 23:08 | Сообщение # 2
был не раз
Сейчас нет на сайте
Самое простое - в Bullet добавить поле fromPlayer. При триггере:
Код
if (unit.isPlayer==this.fromPlayer) return;

Соответственно, при инстанцировании пули игроком fromPlayer устанавливать в true.
Только сначала рекомендую подумать, будет ли достаточно такой простой проверки. Например, если появится второй игрок, или помощник игрока, или какой-нибудь босс, который наносит урон и своим, и чужим. Плюс, со взрывами момент. Лучше создать виды реакций:
Код
public class Bullet : MonoBehaviour {
public enum HitReaction {
  Skip = 0,
  Damage = 100,
  JustDestroyBullet = 200
}
public HitReaction onHitToGround = HitReaction.JustDestroyBullet;
public HitReaction onHitToPlayer = HitReaction.Skip;
public HitReaction onHitToEnemy = HitReaction.Skip;
}

Так система будет расширяемой, можно будет докрутить проверку на второго игрока, или (позже) сделать разрушаемое окружение. Ну и проверять столкновение не с Unit, а с каким-нибудь BulletCatcher (можно разбить Bullet и BulletCatcher по разным слоям, чтобы разгрузить физику).
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Стрельба только по игроку
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг