Передача параметра сетевого пользователя из одного класса

Сеть в Unity3D

Передача параметра сетевого пользователя из одного класса

Сообщение Duke 14 дек 2010, 05:58

Спасибо за помощь с предудыщем вопросом, и заранее благодарю за помощь с этим.
Проблема следующая:

В сетевой игре пользователь логиниться и в это время из mySQL базы данных получает параметры своего оружия (у каждого пользователя они свои взависимости от апдейта).
Все переменный записываются в класс UserData.js

Соответсвенно когда один из играков производит выстрел (Network.Instantiate, к примеру Bullet) то другие игроки, если в них эта пуля попадает, получает от нее повреждение в соответствии с данными из своего UserData.js, а не в соответсвии с параметром из UserData.js пользователя который выстрелил.

Спасибо за советы.
-My Art -
Duke
UNец
 
Сообщения: 8
Зарегистрирован: 08 дек 2010, 13:12

Re: Передача параметра сетевого пользователя из одного класса

Сообщение Guyver 14 дек 2010, 12:35

если это мега ММО то все расчёты делаются на стороне сервера ... и дамагу он выписывает каждому сам ... (иначе скоро появятся неубивашки и прочие полубоги)

если это сетевая игра типа кваки... то можно к буллету присверлить ID оружия из которого этот буллет был выпущен или ваапще голую дамагу

судя по mySQl и прочему .. это всёж мега ММО....

а ваапще в посте я не увидел законченного вопроса ... так что надеюсь угадал.
Xcombat: 3D шутер на летающих тарелках!
Аватара пользователя
Guyver
UNIверсал
 
Сообщения: 392
Зарегистрирован: 21 июл 2010, 08:04
Откуда: Челябинск

Re: Передача параметра сетевого пользователя из одного класса

Сообщение Duke 14 дек 2010, 16:55

Что-то типа кваки но в игре 20 видов оружия и у каждого игрока, в зависимости от левела, параметры каждого оружия считаются в файле UserData и там же хранятся.

Проблема менее глобальная: нужно что бы объект инициализированный Игроком1 получал значения из UserData именно этого игрока. А сейчас получается, что каждый игрок видит объект с Damage взятом из его файла, независимо кем объект был заспавнен.

Или можно поставить по другому вопрос: как в файл с пулей, засунуть параметр из файла UserData конкретного игрока? В данном случае автора выстрела. Если каждый игрок имеет свой UserData.

Возможно можно как-то использовать Array скриптов который создается при спавне нового игрока?
Синтаксис:
Используется javascript
public var playerScripts : ArrayList = new ArrayList();
public var playerDatas : ArrayList = new ArrayList();

function OnPlayerConnected(newPlayer: NetworkPlayer) {
        Spawnplayer(newPlayer);
}      

function Spawnplayer(newPlayer : NetworkPlayer){
      var playerNumber : int = parseInt(newPlayer+"");
      var myNewTrans : Transform = Network.Instantiate(playerPrefab, transform.position, transform.rotation, playerNumber);
      playerScripts.Add(myNewTrans.GetComponent(Ship));
      playerDatas.Add(myNewTrans.GetComponent(UserData));
}
 


UserData выглядит в упрощенном виде примерно так:
Синтаксис:
Используется javascript
class UserData extends Object{

    static var bulletPower: int;
    static var userdata = new Array();        
 

    public function userWeaponData(){
        var URL = "getWeaponData.php";
        var form = new WWWForm();
        form.AddField( "email", email );
        var www = new WWW(URL, form);
        yield www;
       
                var splitString : String = www.text;
        userdata= splitString.Split(";"[0]);
                bulletPower = userdata[1];
    }  


Пуля появляется так:
Синтаксис:
Используется javascript
if (weapon.number == 5){
        target = GameObject.Find("sight(Clone)");
        transform.LookAt (target.transform);
        if (Time.time > reloadTime + lastShot && ammoCount > 0) {
            if (Input.GetButtonDown("Fire2")){
                    var bullit = Network.Instantiate(bullitPrefab, transform.position, transform.rotation,0);
                    lastShot = Time.time;
                    ammoCount--;
            }
        }
    }  


У пули есть Контроллер Скрипт который и получает нужные данные из UserData:
Синтаксис:
Используется javascript
var bulletPower = UserData.bulletPower; //ВОТ ТУТ!
function OnCollisionEnter( collision : Collision ){
    var contact : ContactPoint = collision.contacts[0];
    var rotation = Quaternion.FromToRotation( Vector3.up, contact.normal );
    var instantiatedSpark : GameObject = Instantiate(spark, contact.point, rotation );
    if (collision.rigidbody){
        collision.collider.SendMessage("ApplyDamage", bulletPower ,SendMessageOptions.DontRequireReceiver);
    }
}  


Ну и ApplyDamage имеется в скрипте управляющем пользователем:
Синтаксис:
Используется javascript
        function ApplyDamage(hitPoints : float){
                if(owner!=null && Network.player==owner){
                        ggHealth = ggHealth  - hitPoints;
                }
        }


Надеюсь это поможет, спасибо за ответ.
-My Art -
Duke
UNец
 
Сообщения: 8
Зарегистрирован: 08 дек 2010, 13:12


Re: Передача параметра сетевого пользователя из одного класса

Сообщение Duke 14 дек 2010, 20:55

Интересно. Но не совсем понятно.
Могу ли я тогда как-то добраться до версии UserData которая принадлежит networkView.owner?

UserData.js - компонент объекта Player, который инициализирует пулю и является, соответственно networkView.owner.

Немножко другой вопрос:
Каждый сетевой игрок имеет скрипт Player.js в котором есть переменная health.
Как мне показать одному игроку здоровье другого?

Наверняка способ примерно похож на то, как дать пуле повреждение в соответствии с UserData игрока сделавшего выстрел.
-My Art -
Duke
UNец
 
Сообщения: 8
Зарегистрирован: 08 дек 2010, 13:12

Re: Передача параметра сетевого пользователя из одного класса

Сообщение Kann 14 дек 2010, 22:44

а чего тут не понятного ?
isMine - проверка на то принадлежит ли объект текущему клиенту, само собой если true, в таком случае вы передаете любые переменные обычным способом куда хотите.
ну и если надо что бы все клиенты получили какоето значение, в таком случае используем
Синтаксис:
Используется csharp
networkView.RPC("MyFunction", RPCMode.All, "someValue");

в таком случае читеров будет море, так как вы организовываете логику на клиенте.....
Kann
Старожил
 
Сообщения: 553
Зарегистрирован: 05 ноя 2009, 14:06

Re: Передача параметра сетевого пользователя из одного класса

Сообщение Duke 14 дек 2010, 23:57

Я пока ничего не организовываю, а пытаюсь разобраться как это работает и как сделать правильно.
Но так как я проф. 3д художник, а не программист, периодически возникают проблемы с пониманием. Поэтому извиняюсь за глупые вопросы. В мануалах и туториалах описаны простые примеры и мне бывает сложно использовать их в более сложных случаях.

Не могли бы вы накидать схему методов и их примерное содержание если имеется:

файл содержащий силу пули конкретного пользователя из базы данных.
Возможно он должен иметь исключительно серверный код и рассылать готовые данные пользователям...

черт, совсем запутался.

Заранее спасибо.
-My Art -
Duke
UNец
 
Сообщения: 8
Зарегистрирован: 08 дек 2010, 13:12

Re: Передача параметра сетевого пользователя из одного класса

Сообщение Kann 15 дек 2010, 09:09

если вы хотите получать значения пули из БД, в таком случае логичнее сделать так, когда клиент подключается в игру, либо уже в самой игре во время конфигурирования оружия(я хз как там у вас по сценарию)сервер получает данные из БД на конкретного клиента и помещает их в переменные, далее во время стрельбы клиент посылает серверу информацию о том что клавиша огня была нажата, сервер инстансирует префаб вашей пули, и передает в код пули нужные значения.
Kann
Старожил
 
Сообщения: 553
Зарегистрирован: 05 ноя 2009, 14:06

Re: Передача параметра сетевого пользователя из одного класса

Сообщение Duke 15 дек 2010, 18:38

Большое спасибо за пояснение, потихоньку проясняется.

сервер получает данные из БД на конкретного клиента и помещает их в переменные

Как это выглядит на практике?
Файл UserData в котором есть метод GetData находится у каждого пользователя. Ок?
Достаточно ли запустить инициализацию переменных с проверкой if(Network.isServer)?
Тогда необходимо ли держать отдельные переменные (array, возможно) для каждого пользователя или достаточно, что у всех пользователей переменные одноименные, а сервер сам сообразит чью отправить?

клиент имеет код типа:

if(Network.isClient){
if (Input.GetButton ("Fire1")){
networkView.RPC("Fire", RPCMode.Server, transfrom.position, transfrom.rotation, Network.owner);
}
}

Может ли следующая функция находиться в другом файле?
@RPC
function Fire(........){
firedBullet = Network.Instantiate(bullet, transform.position+Vector3(0,4,0), transform.rotation,0);
firedBullet.rigidbody.AddForce(0,0,4);
}

передает в код пули нужные значения.

С этим не понятно.
через var bulletScript = firedBullet.GetComponent(скрипт пули) ?
а потом bulletScript.damage = UserData.damage; ??
-My Art -
Duke
UNец
 
Сообщения: 8
Зарегистрирован: 08 дек 2010, 13:12

Re: Передача параметра сетевого пользователя из одного класса

Сообщение Duke 15 дек 2010, 19:00

возможно у кого то есть на заметке пример похожей транзакции? По более конкретному примеру разобрался бы сам.
Примеры туториалов и мануала понятны, но на их основе у меня не получается выполнить более сложное решение.
-My Art -
Duke
UNец
 
Сообщения: 8
Зарегистрирован: 08 дек 2010, 13:12

Re: Передача параметра сетевого пользователя из одного класса

Сообщение Kann 20 дек 2010, 23:09

на стороне сервера вам нужно сделать проверку на принадлежность клиента
Синтаксис:
Используется csharp
if(player==Network.player)
Kann
Старожил
 
Сообщения: 553
Зарегистрирован: 05 ноя 2009, 14:06


Вернуться в Сеть

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1