Войти
UnityФорумСеть

Вопрос по Unet: Spawning...

#0
13:10, 18 июля 2016

Привет.
Прохожу туториалы по Unet тут. Я никак в толк не возьму вот есть код:

/// Bullet.cs
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;

public class Bullet : MonoBehaviour
{

    void OnCollisionEnter(Collision collision)
    {
        GameObject hit = collision.gameObject;
        Health health = hit.GetComponent<Health>();
        if (health != null)
        {
            health.TakeDamage(10);
        }
               
        Destroy(gameObject);
    }
}

// PlayerController.cs
using UnityEngine;
using UnityEngine.Networking;

public class PlayerController : NetworkBehaviour
{
    public GameObject bulletPrefab;
    public Transform bulletSpawn;

    void Update()
    {
        if (!isLocalPlayer)
        {
            return;
        }

        // Called on the client
        var x = Input.GetAxis("Horizontal") * Time.deltaTime * 150.0f;
        var z = Input.GetAxis("Vertical") * Time.deltaTime * 3.0f;

        transform.Rotate(0, x, 0);
        transform.Translate(0, 0, z);

        if (Input.GetKeyDown(KeyCode.Space))
        {
            CmdFire();
        }
    }


    // Called on a client, run on a server
    [Command]
    void CmdFire()
    {
        // Create the Bullet from the Bullet Prefab
        GameObject bullet = (GameObject)Instantiate(bulletPrefab, bulletSpawn.position,  bulletSpawn.rotation);

        // Add velocity to the bullet
        bullet.GetComponent<Rigidbody>().velocity = bullet.transform.forward * 6;

        // Spawn the bullet on the Clients
        NetworkServer.Spawn(bullet);              // <---- Creating a new Bullet on clients

        // Destroy the bullet after 2 seconds
        Destroy(bullet, 2.0f);
    }

    public override void OnStartLocalPlayer()
    {
        GetComponent<MeshRenderer>().material.color = Color.blue;
    }
}

Я никак не пойму почему когда я делаю NetworkServer.Spawn на клиенте не вызывается(для спавненого объекта Bullet) OnCollisionEnter. А вся суть в том, что жизни уменьшаются как на клиенте так и на сервере, но визуальный бар уменьшается только на сервере. В доках сказано: "This is because we are not synchronizing the value of the Foreground GameObject’s RectTransform across the network and the code to set the Healthbar’s Size Delta is only being run on the Server". А почему собсно мы должны его синхронизировать ? Я видимо неправильно понимаю как работает этот Spawn. Подскажите в чём моя ошибка ?

Следуя моей логике, когда мы вызываем NetworkServer.Spawn мы создаём объекты на всех клиентах. А если так, то для них тоже должны вызываться все скрипты на них висящие(в том числе и OnCollisionEnter, который висит на Bullet'е).

Заранее благодарю.


#1
13:55, 18 июля 2016

упакуите весь ваш тестовый проект и выложите где нибудь для скачивания, непонятно что у вас навешано на префабы и тд

#2
14:08, 18 июля 2016

sinoby
Не вопрос: https://www.dropbox.com/s/0oo7qy4zwfczrir/Proto.rar?dl=0

#3
17:18, 18 июля 2016

Короче я просто ступил.. (всё там вызывается).

Тему прикрываю.

UnityФорумСеть

Тема в архиве.

Тема закрыта.