Изменить пули как власть - PullRequest
0 голосов
/ 03 апреля 2020

Я играю в 2D и хочу, чтобы мой игрок мог менять пули при столкновении с объектом (силой) и уничтожать этот объект. У меня есть сценарий, и я подумал, что мне нужно реализовать 2 переменные prefab ON / Off, но теперь гораздо больше думаю, что я хочу изменить с помощью тега (мой игрок имеет в своем сценарии публикацию c Rigidbody2D bullet) и эта функция

void Fire()
    {
        if (photonView.IsMine)
        {
            var firedBullet = Instantiate(bullet, barrel.position, barrel.rotation);
            firedBullet.AddForce(barrel.up * bulletSpeed);
        }
    }

это сценарий, над которым я работал для переключения маркеров, но я думаю, что он не будет работать, чтобы изменить маркер, который я добавил в инспекторе для сценария персонажа, чтобы отключить из этого скрипта и добавить другую пулю. Как я могу сделать это по тегу?

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

public class WeaponSwitching : MonoBehaviour
{
    [SerializeField] private GameObject pickupEffect;
    public GameObject[] DisablePrefab;
    public GameObject[] EnablePrefab;
    public int selectBullet = 0;
    // Start is called before the first frame update
   

    // Update is called once per frame
    public void Bullet(Character bullet)
    {
        var effect = Instantiate(pickupEffect, transform.position, transform.rotation);

        foreach (GameObject disable in DisablePrefab)
        {
            disable.SetActive(false);
        }
        foreach (GameObject enable in EnablePrefab)
        {
            enable.SetActive(true);
        }
        Destroy(gameObject);
        Destroy(effect, 3.0f);
    }
  
}
и я пытаюсь это сделать с помощью скрипта BulletSwitch для вызова функции из сценария переключения оружия

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

public class BulletSwitch : MonoBehaviour
{

    [SerializeField] private Character bullet;
    // Start is called before the first frame update

    private void Awake()
    {
        if (!bullet) bullet = GetComponent<Character>();

    }

    private void OnTriggerEnter2D(Collider2D other)
    {
        // or whatever tag your powerups have
        if (!other.CompareTag("Bullet"))
        {
            Debug.LogWarning($"Registered a collision but with wrong tag: {other.tag}", this);
            return;
        }

        var Bullet = other.GetComponent<WeaponSwitching>();
        if (!Bullet)
        {
            Debug.LogError($"Object {other.name} is tagged PowerUp but has no PowerUp component attached", this);
            return;
        }

        Debug.Log("Found powerup, pick it up!", this);
        Bullet.Bullet(bullet);
    }
}

персонаж-инспектор

после того, как мой игрок столкнулся с объектом, пули исчезают.

1 Ответ

0 голосов
/ 04 апреля 2020

Вы можете создать массив префабов и изменить его на правильный тип маркера при включении питания, установив для переменной CurrentBulletType один из типов из массива. Поэтому, когда вы нажимаете powerup X, измените тип маркера на один из типов в массиве.

public GameObject currentPrefab;
public GameObject[] bulletPrefabs;

private void OnTriggerEnter2D(Collider2D other)
{
    string tagString = other.tag;
    bool foundObject = true;
    switch (tagString)
    {
        case "standard bullet":
            currentPrefab = bulletPrefabs[0];
            break;
        case "fancy bullet":
            currentPrefab = bulletPrefabs[1];
            break;
        case "even fancier bullet":
            currentPrefab = bulletPrefabs[2];
            break;
        default:
            foundObject = false;
            break;
    }
    if (foundObject) other.gameObject.SetActive(false);
}

Вместо этого вы можете использовать словарь для прямой ссылки на правильный префаб по имени строки (тегу), чтобы упростить его. чтобы добавить больше типов пуль.

//dictionairy to reference bullet types quickly
public Dictionary<string, BulletTypes> bulletLibrary = new Dictionary<string, BulletTypes>();
//set these in the inspector
public BulletTypes[] bulletTypes;

[System.Serializable]
public struct BulletTypes
{
    public string bulletName;
    public GameObject prefab;
    //public int bulletPower; //more data if you wish
}

private void Start()
{
    //fill the dictionary based on the filled bullet type array in inspector
    for (int i = 0; i < bulletTypes.Length; i++)
    {
        if (bulletTypes[i].bulletName != "")
            bulletLibrary.Add(bulletTypes[i].bulletName, bulletTypes[i]);
        else
            print("bullet added, but name empty");
    }
}

private void OnTriggerEnter2D(Collider2D other)
{
    string tagString = other.tag;

    //if the collided tag is in the dictionary, we can reference the bullet type from that dictionairy
    if (bulletLibrary.ContainsKey(tagString))
    {
        print("spawn: " + bulletLibrary[tagString].bulletName);
        print("prefab: " + bulletLibrary[tagString].prefab);

        //all the data you need is in: bulletLibrary[tagString];
        //Bullet.Bullet(bulletLibrary[tagString]);
        other.gameObject.SetActive(false);
    }
}

Sidenote: Если вы порождаете много пуль, вы можете использовать объединение. SimplePool это легко и просто. Вместо того, чтобы вызывать: создавать и уничтожать, вы вызываете: SimplePool.Spawn () и SimplePool.DeSpawn ().

Если у вас есть еще вопросы по этому вопросу, не стесняйтесь задавать;)

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