Spawn в фиксированной позиции 2D Game - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь сделать многопользовательскую игру, и у меня проблема с созданием префабов. Я хочу, чтобы эти префабы появлялись в двух фиксированных позициях, но я не понимаю, почему мой скрипт не работает, потому что когда я запускаю игру, объекты появляются в одной позиции. Я создал пустой игровой объект (я назвал его Spawner и добавил скрипт) и добавил 2 игровых объекта (Position1, Position2) как Childs. Префаб появляется в положении Spawner, а не в позициях 1 и 2. Вот сценарий, который я использовал. Также я должен добавить к нему PhotonView и Photon Transform? и что-то с PunRP C?

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

public class SpawnPosition : MonoBehaviour
{
    public GameObject[] powersPrefab;
    public Transform[] points;
    public float beat= (60/130)*2;
    private float timer;




    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (timer > beat)
        {
            GameObject powers = Instantiate(powersPrefab[Random.Range(0, 2)]);
            powers.transform.localPosition = Vector2.zero;
            timer -= beat;

        }
        timer += Time.deltaTime;
    }
}

Ответы [ 2 ]

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

Это должно работать

void Update() {
        if (timer > beat) {
            GameObject powers = Instantiate(powersPrefab[Random.Range(0, 2)]);
            powers.transform.localPosition = points[Random.Range(0, points.Length)].position;
            timer -= beat;

        }
        timer += Time.deltaTime;
    }
}

Вы не назначаете правильную позицию, и так как они не имеют родителей power.transform.position = Vector2.zero означает, что глобальная позиция власти всегда будет 0,0,0. Таким образом, вы должны назначить его, как я написал выше, и он также рандомизирован.

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

Вы всегда устанавливаете

powers.transform.localPosition = Vector2.zero

Объект создается на уровне root без родителя, это равносильно установке его абсолютной позиции .... Вы всегда устанавливаете его в начало координат Unity.


Вы, вероятно, хотели бы породить его в позиции включения элементов в points, например, например:

var powers = Instantiate(
    powersPrefab[Random.Range(0, powersPrefab.Length)], 
    points[Random.Range(0, points.Length)].position, 
    Quaternion.identity
);

см. Instantiate для доступных перегрузок.


Однако, поскольку вы также заявляете, что это для многопользовательской игры, вы не должны использовать Instantiate вообще , поскольку это только порождает этот объект на этом клиенте, но не на других. Скорее всего, вам следует убедиться, что это устройство запускается только на одном из ваших клиентов, и вместо этого использовать PhotonNetwork.Instantiate.

Что-то вроде, например,

public class SpawnPosition : MonoBehaviour
{
    public GameObject[] powersPrefab;
    public Transform[] points;
    public float beat= (60/130)*2;
    private float timer;

    // Update is called once per frame
    void Update()
    {
        // only run this if you are the master client
        if(!PhotonNetwork.isMasterClient) return;

        if (timer > beat)
        {
            // spawn the prefab object over network
            // Note: This requires you to also reference the prefabs in Photon as spawnable object
            Instantiate(
                powersPrefab[Random.Range(0, 2)].name, 
                points[Random.Range(0, points.Length)].position, 
                Quaternion.identity, 
                0
            );
            timer -= beat;
        }
        timer += Time.deltaTime;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...