Разделить управление персонажами - Форум Игроделов
Пт, 25 Июл 2025, 03:40 
 
Приветствую Вас Гость Главная | Регистрация | Вход
Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Разделить управление персонажами
freeprogrammerДата: Пн, 24 Дек 2012, 04:32 | Сообщение # 1
 
Сообщений: 7
Награды: 0
Репутация: 0
Статус: Offline
Script управляющий движением персонажа при подключении по сети нескольких игроков управление дублируется на всех. У меня почему то управление блокируется на основном, зато клон перемещается отлично )))
вот неизменненный Script без всяких проверок:

Код
//This script controls how the soldier will move.
@script RequireComponent(CharacterController);

var forwardSpeedMultiplier : float = 3.0;
var strafeSpeedMultiplier : float = 2.0;
var turnSpeedMultiplier : float = 6.0;
var gravity : float = 9.8;
//var soldierLocation : String = "smoothWorldPosition/soldierSkeleton";
var soldier : Transform;
var turnSpeed : float = 0.0;
var forwardSpeed : float = 0.0; //Speed the character will moved at.
var strafeSpeed : float = 0.0;
var isGrounded : boolean;

private var stopAfterLanding : float = 0.0; //How much time in seconds will the character stop after landing.
private var fallSpeed : float = 0.0;
private var lastGroundedTime : float; //Last time since soldier was touching the ground.
private var lastLandingTime : float; //Last time since the soldier landed after a fall.
private    var targetForwardSpeed : float;
private    var targetStrafeSpeed : float;
private var crouchControllerScript : crouchController;
private var isFalling : boolean;
private var healthScript : health;
private var recoilAmount : float;
private var recoilAmountTarget : float;

function Start(){
     crouchControllerScript = GetComponent("crouchController");
     healthScript = GetComponent("health");
     isFalling = false;
     //soldier = transform.Find(soldierLocation);
}

function Update () {
     //Stick to platforms.
     var rayHeight : float = 0.5;
     var rayOrigin : Vector3 = transform.position + Vector3.up * rayHeight;
     var platformRay : Ray = new Ray(rayOrigin, Vector3.down);
     var rayDistance : float = rayHeight * 2.0;
     var platformHit : RaycastHit;
     if (Physics.Raycast(platformRay, platformHit, rayDistance)){
      if(platformHit.transform.root != transform){
       isGrounded = true;
       transform.position.y = platformHit.point.y;
      }
     }
     else{
      isGrounded = false;
     }
         
     var controller : CharacterController = GetComponent(CharacterController);
     //Hit recoil.
     var recoilVector : Vector3 = Vector3.zero;
     var recoilInhibit : float = 1.0;
     var deathInhibit : float = 1.0;
     if (healthScript != null){
      var lastHitTime : float = healthScript.GetLastHitTime();
      var recoilDirecion : Vector3 = healthScript.GetrecoilDirecion();
      var maxRecoil : float = 0.6;
      var timeAfterHit : float = Time.time - lastHitTime;
      var recoilAmountTarget : float = 0.0;
      if(timeAfterHit < maxRecoil && lastHitTime != 0){
       recoilAmountTarget = maxRecoil-timeAfterHit;
       recoilAmountTarget *= (1-Mathf.Abs(Input.GetAxis("Vertical")));
       recoilAmountTarget *= (1-Mathf.Abs(Input.GetAxis("Horizontal")));
      }
      if(recoilAmount < recoilAmountTarget){
       recoilAmount = Mathf.Lerp(recoilAmount, recoilAmountTarget, Time.deltaTime);
      }
      else{
       recoilAmount = Mathf.Lerp(recoilAmount, recoilAmountTarget, Time.deltaTime*20);
      }
      var biasRecoilAmount : float = recoilAmount; //Bias to 0.
      biasRecoilAmount /= maxRecoil;
      biasRecoilAmount = Mathf.Pow(biasRecoilAmount,2.0);
      biasRecoilAmount *= maxRecoil;
      recoilVector = recoilDirecion * biasRecoilAmount;
      recoilInhibit = 1 -(recoilAmount*0.65/maxRecoil);
      var health : float = healthScript.health;
      if(health <= 0){
       deathInhibit = 0;
      }
      else{
       deathInhibit = 1.0;
      }
     }
     //Position.
     if (isGrounded){
      if (isFalling){
       isFalling = false;
       lastLandingTime = Time.time;
       stopAfterLanding = (lastLandingTime - lastGroundedTime) * 2.0;
      }
      fallSpeed = 0.0;
     }
     else{
      if (!isFalling){
       isFalling = true;
       lastGroundedTime = Time.time;
      }
      fallSpeed += gravity * Time.deltaTime;
     }
     var moveDirection : Vector3;
     moveDirection.y -= fallSpeed;
     if (isGrounded){
      targetForwardSpeed = Input.GetAxis("Vertical");
      targetStrafeSpeed = Input.GetAxis("Horizontal");
      targetForwardSpeed *=  forwardSpeedMultiplier;
      targetStrafeSpeed *= strafeSpeedMultiplier;
      if(Input.GetAxis("Vertical") < 0){//Slow down going backwards;
       targetForwardSpeed *= 0.5;
      }
      if(Input.GetKey(KeyCode.LeftShift)){//Sprint with left shift;
       targetForwardSpeed *= 1.5;
       targetStrafeSpeed *= 1.5;
      }
     }
     if(crouchControllerScript != null){ //Crouch speed multiplier.
      targetForwardSpeed = Mathf.Lerp(targetForwardSpeed, targetForwardSpeed * crouchControllerScript.crouchSpeedMultiplier, crouchControllerScript.globalCrouchBlend);
     }
     if(Time.time <= lastLandingTime + stopAfterLanding && stopAfterLanding > 0.5){
      var timeSinceLanding : float = Time.time - lastLandingTime;
      var landingSpeedInhibit : float = Mathf.Pow(timeSinceLanding / stopAfterLanding, 1.5);
      targetForwardSpeed *= landingSpeedInhibit;
      targetStrafeSpeed *= landingSpeedInhibit;
     }
     forwardSpeed = Mathf.Lerp(forwardSpeed, targetForwardSpeed, Time.deltaTime * 15.0);
     strafeSpeed = Mathf.Lerp(strafeSpeed, targetStrafeSpeed, Time.deltaTime * 15.0);
     moveDirection += soldier.forward * forwardSpeed * recoilInhibit * deathInhibit;
     moveDirection += soldier.right * strafeSpeed * recoilInhibit * deathInhibit;
     moveDirection += recoilVector;
         
     controller.Move(moveDirection * Time.deltaTime);//Move the controller.
         
     //Rotation.
     var targetTurnSpeed : float = 0.0;
     targetTurnSpeed= Input.GetAxis("Mouse X");
     targetTurnSpeed *= Mathf.Pow(turnSpeedMultiplier,3);
     targetTurnSpeed *= deathInhibit;
     turnSpeed = Mathf.Lerp(turnSpeed, targetTurnSpeed, Time.deltaTime * 25.0);
     transform.rotation.eulerAngles.y += turnSpeed * Time.deltaTime;
}


Собственно просьба помогите грамотно разделить управление хотя бы для управления клавиатурой, дальше я сам разберусь...


Сообщение отредактировал freeprogrammer - Сб, 29 Дек 2012, 09:42
 
СообщениеScript управляющий движением персонажа при подключении по сети нескольких игроков управление дублируется на всех. У меня почему то управление блокируется на основном, зато клон перемещается отлично )))
вот неизменненный Script без всяких проверок:

Код
//This script controls how the soldier will move.
@script RequireComponent(CharacterController);

var forwardSpeedMultiplier : float = 3.0;
var strafeSpeedMultiplier : float = 2.0;
var turnSpeedMultiplier : float = 6.0;
var gravity : float = 9.8;
//var soldierLocation : String = "smoothWorldPosition/soldierSkeleton";
var soldier : Transform;
var turnSpeed : float = 0.0;
var forwardSpeed : float = 0.0; //Speed the character will moved at.
var strafeSpeed : float = 0.0;
var isGrounded : boolean;

private var stopAfterLanding : float = 0.0; //How much time in seconds will the character stop after landing.
private var fallSpeed : float = 0.0;
private var lastGroundedTime : float; //Last time since soldier was touching the ground.
private var lastLandingTime : float; //Last time since the soldier landed after a fall.
private    var targetForwardSpeed : float;
private    var targetStrafeSpeed : float;
private var crouchControllerScript : crouchController;
private var isFalling : boolean;
private var healthScript : health;
private var recoilAmount : float;
private var recoilAmountTarget : float;

function Start(){
     crouchControllerScript = GetComponent("crouchController");
     healthScript = GetComponent("health");
     isFalling = false;
     //soldier = transform.Find(soldierLocation);
}

function Update () {
     //Stick to platforms.
     var rayHeight : float = 0.5;
     var rayOrigin : Vector3 = transform.position + Vector3.up * rayHeight;
     var platformRay : Ray = new Ray(rayOrigin, Vector3.down);
     var rayDistance : float = rayHeight * 2.0;
     var platformHit : RaycastHit;
     if (Physics.Raycast(platformRay, platformHit, rayDistance)){
      if(platformHit.transform.root != transform){
       isGrounded = true;
       transform.position.y = platformHit.point.y;
      }
     }
     else{
      isGrounded = false;
     }
         
     var controller : CharacterController = GetComponent(CharacterController);
     //Hit recoil.
     var recoilVector : Vector3 = Vector3.zero;
     var recoilInhibit : float = 1.0;
     var deathInhibit : float = 1.0;
     if (healthScript != null){
      var lastHitTime : float = healthScript.GetLastHitTime();
      var recoilDirecion : Vector3 = healthScript.GetrecoilDirecion();
      var maxRecoil : float = 0.6;
      var timeAfterHit : float = Time.time - lastHitTime;
      var recoilAmountTarget : float = 0.0;
      if(timeAfterHit < maxRecoil && lastHitTime != 0){
       recoilAmountTarget = maxRecoil-timeAfterHit;
       recoilAmountTarget *= (1-Mathf.Abs(Input.GetAxis("Vertical")));
       recoilAmountTarget *= (1-Mathf.Abs(Input.GetAxis("Horizontal")));
      }
      if(recoilAmount < recoilAmountTarget){
       recoilAmount = Mathf.Lerp(recoilAmount, recoilAmountTarget, Time.deltaTime);
      }
      else{
       recoilAmount = Mathf.Lerp(recoilAmount, recoilAmountTarget, Time.deltaTime*20);
      }
      var biasRecoilAmount : float = recoilAmount; //Bias to 0.
      biasRecoilAmount /= maxRecoil;
      biasRecoilAmount = Mathf.Pow(biasRecoilAmount,2.0);
      biasRecoilAmount *= maxRecoil;
      recoilVector = recoilDirecion * biasRecoilAmount;
      recoilInhibit = 1 -(recoilAmount*0.65/maxRecoil);
      var health : float = healthScript.health;
      if(health <= 0){
       deathInhibit = 0;
      }
      else{
       deathInhibit = 1.0;
      }
     }
     //Position.
     if (isGrounded){
      if (isFalling){
       isFalling = false;
       lastLandingTime = Time.time;
       stopAfterLanding = (lastLandingTime - lastGroundedTime) * 2.0;
      }
      fallSpeed = 0.0;
     }
     else{
      if (!isFalling){
       isFalling = true;
       lastGroundedTime = Time.time;
      }
      fallSpeed += gravity * Time.deltaTime;
     }
     var moveDirection : Vector3;
     moveDirection.y -= fallSpeed;
     if (isGrounded){
      targetForwardSpeed = Input.GetAxis("Vertical");
      targetStrafeSpeed = Input.GetAxis("Horizontal");
      targetForwardSpeed *=  forwardSpeedMultiplier;
      targetStrafeSpeed *= strafeSpeedMultiplier;
      if(Input.GetAxis("Vertical") < 0){//Slow down going backwards;
       targetForwardSpeed *= 0.5;
      }
      if(Input.GetKey(KeyCode.LeftShift)){//Sprint with left shift;
       targetForwardSpeed *= 1.5;
       targetStrafeSpeed *= 1.5;
      }
     }
     if(crouchControllerScript != null){ //Crouch speed multiplier.
      targetForwardSpeed = Mathf.Lerp(targetForwardSpeed, targetForwardSpeed * crouchControllerScript.crouchSpeedMultiplier, crouchControllerScript.globalCrouchBlend);
     }
     if(Time.time <= lastLandingTime + stopAfterLanding && stopAfterLanding > 0.5){
      var timeSinceLanding : float = Time.time - lastLandingTime;
      var landingSpeedInhibit : float = Mathf.Pow(timeSinceLanding / stopAfterLanding, 1.5);
      targetForwardSpeed *= landingSpeedInhibit;
      targetStrafeSpeed *= landingSpeedInhibit;
     }
     forwardSpeed = Mathf.Lerp(forwardSpeed, targetForwardSpeed, Time.deltaTime * 15.0);
     strafeSpeed = Mathf.Lerp(strafeSpeed, targetStrafeSpeed, Time.deltaTime * 15.0);
     moveDirection += soldier.forward * forwardSpeed * recoilInhibit * deathInhibit;
     moveDirection += soldier.right * strafeSpeed * recoilInhibit * deathInhibit;
     moveDirection += recoilVector;
         
     controller.Move(moveDirection * Time.deltaTime);//Move the controller.
         
     //Rotation.
     var targetTurnSpeed : float = 0.0;
     targetTurnSpeed= Input.GetAxis("Mouse X");
     targetTurnSpeed *= Mathf.Pow(turnSpeedMultiplier,3);
     targetTurnSpeed *= deathInhibit;
     turnSpeed = Mathf.Lerp(turnSpeed, targetTurnSpeed, Time.deltaTime * 25.0);
     transform.rotation.eulerAngles.y += turnSpeed * Time.deltaTime;
}


Собственно просьба помогите грамотно разделить управление хотя бы для управления клавиатурой, дальше я сам разберусь...

Автор - freeprogrammer
Дата добавления - 24 Дек 2012 в 04:32
HunjethДата: Пн, 24 Дек 2012, 05:44 | Сообщение # 2
 
Сообщений: 354
Награды: 1
Репутация: 112
Статус: Offline
скрипт управления должен быть на объекте который не виден в интернете тоесть не на игроке
Input.. надо засунуть в другой скрипт и повесить на другой объект например гуи


Сообщение отредактировал Hunjeth - Пн, 24 Дек 2012, 05:52
 
Сообщениескрипт управления должен быть на объекте который не виден в интернете тоесть не на игроке
Input.. надо засунуть в другой скрипт и повесить на другой объект например гуи

Автор - Hunjeth
Дата добавления - 24 Дек 2012 в 05:44
freeprogrammerДата: Пн, 24 Дек 2012, 06:07 | Сообщение # 3
 
Сообщений: 7
Награды: 0
Репутация: 0
Статус: Offline
я правильно понял: создам пустышку, повешу на неё скрипты управления Move, на объекте оставлю скрипты анимации. Или вообще убрать все скрипты визуальные с объекта? Т.к. объект создан префабом и на нем висит своя камера, движение и т.д., в сцене его нет. Появляется при подключении игрока с помощью скрипта (Spawn) - висит на пустышке.

Код
var pgo: GameObject;

function OnNetworkLoadedLevel () {

Network.Instantiate(pgo, transform.position, transform.rotation, 0);
}
function OnPlayerDisconnected (player : NetworkPlayer) {
Network.RemoveRPCs(player, 0);
Network.DestroyPlayerObjects(player);
}
 
Сообщениея правильно понял: создам пустышку, повешу на неё скрипты управления Move, на объекте оставлю скрипты анимации. Или вообще убрать все скрипты визуальные с объекта? Т.к. объект создан префабом и на нем висит своя камера, движение и т.д., в сцене его нет. Появляется при подключении игрока с помощью скрипта (Spawn) - висит на пустышке.

Код
var pgo: GameObject;

function OnNetworkLoadedLevel () {

Network.Instantiate(pgo, transform.position, transform.rotation, 0);
}
function OnPlayerDisconnected (player : NetworkPlayer) {
Network.RemoveRPCs(player, 0);
Network.DestroyPlayerObjects(player);
}

Автор - freeprogrammer
Дата добавления - 24 Дек 2012 в 06:07
HunjethДата: Пн, 24 Дек 2012, 06:12 | Сообщение # 4
 
Сообщений: 354
Награды: 1
Репутация: 112
Статус: Offline
скорей всего что Network.Instantiate значит что весь объект будет транслироваться в интернете тебе это и надо только управление должно быть отдельно должен быть еще 1 объект на сцене каторый будет упровлять игроком но не будет поставлен на сцену через Network.Instantiate

Сообщение отредактировал Hunjeth - Пн, 24 Дек 2012, 06:14
 
Сообщениескорей всего что Network.Instantiate значит что весь объект будет транслироваться в интернете тебе это и надо только управление должно быть отдельно должен быть еще 1 объект на сцене каторый будет упровлять игроком но не будет поставлен на сцену через Network.Instantiate

Автор - Hunjeth
Дата добавления - 24 Дек 2012 в 06:12
freeprogrammerДата: Пн, 24 Дек 2012, 06:32 | Сообщение # 5
 
Сообщений: 7
Награды: 0
Репутация: 0
Статус: Offline
Вот если в первом посте вместо строчки:
Код
var controller : CharacterController = GetComponent(CharacterController);

поставлю код проверки:
Код
if (networkView.isMine)    
    {
     var controller : NetworkRigidbody = GameObject.Find("Player(Clone)").GetComponent("NetworkRigidbody");
     controller.enabled = false;
    }
    else    
    {
     name = "Player(Remote)";
     var controller2 : NetworkRigidbody = GameObject.Find("Player(Remote)").GetComponent("NetworkRigidbody");
     controller2.enabled = true;
     return;
    }
}

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


Сообщение отредактировал freeprogrammer - Пн, 24 Дек 2012, 06:34
 
СообщениеВот если в первом посте вместо строчки:
Код
var controller : CharacterController = GetComponent(CharacterController);

поставлю код проверки:
Код
if (networkView.isMine)    
    {
     var controller : NetworkRigidbody = GameObject.Find("Player(Clone)").GetComponent("NetworkRigidbody");
     controller.enabled = false;
    }
    else    
    {
     name = "Player(Remote)";
     var controller2 : NetworkRigidbody = GameObject.Find("Player(Remote)").GetComponent("NetworkRigidbody");
     controller2.enabled = true;
     return;
    }
}

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

Автор - freeprogrammer
Дата добавления - 24 Дек 2012 в 06:32
HunjethДата: Пн, 24 Дек 2012, 06:43 | Сообщение # 6
 
Сообщений: 354
Награды: 1
Репутация: 112
Статус: Offline
поставлю код проверки: biggrin и что ты проверил этим?
Я не то имел в виду

"Network.Instantiate(pgo, transform.position, transform.rotation, 0);"
надо понимать что Network.Instantiate значит что весь префаб будет в интернете

в soldierMovement
Код
@HideInInspector var targetForwardSpeed : float;
@HideInInspector var targetStrafeSpeed : float;


в нов скрипт
Код

var newplayer : GameObject;
var _soldierMovement : soldierMovement;
function Start() {
                 newplayer = Network.Instantiate(pgo, transform.position, transform.rotation, 0);
                 _soldierMovement = newplayer.GetComponect(soldierMovement);
}

function Update() {
            _soldierMovement.targetForwardSpeed = Input.GetAxis("Vertical");
            _soldierMovement.targetStrafeSpeed = Input.GetAxis("Horizontal");           
}


Сообщение отредактировал Hunjeth - Вс, 30 Дек 2012, 15:25
 
Сообщениепоставлю код проверки: biggrin и что ты проверил этим?
Я не то имел в виду

"Network.Instantiate(pgo, transform.position, transform.rotation, 0);"
надо понимать что Network.Instantiate значит что весь префаб будет в интернете

в soldierMovement
Код
@HideInInspector var targetForwardSpeed : float;
@HideInInspector var targetStrafeSpeed : float;


в нов скрипт
Код

var newplayer : GameObject;
var _soldierMovement : soldierMovement;
function Start() {
                 newplayer = Network.Instantiate(pgo, transform.position, transform.rotation, 0);
                 _soldierMovement = newplayer.GetComponect(soldierMovement);
}

function Update() {
            _soldierMovement.targetForwardSpeed = Input.GetAxis("Vertical");
            _soldierMovement.targetStrafeSpeed = Input.GetAxis("Horizontal");           
}

Автор - Hunjeth
Дата добавления - 24 Дек 2012 в 06:43
freeprogrammerДата: Сб, 29 Дек 2012, 16:10 | Сообщение # 7
 
Сообщений: 7
Награды: 0
Репутация: 0
Статус: Offline
прихожу к выводу, что нужно еще курить и курить Network.Instantiate )))
Но как я понимаю принцип следующий: если я создал объект видимый всем сетевым клиентам, то все скрипты находящиеся внутри данного объекта будут выполнятся одновременно на всех одинаковых объектах не зависимо от того принадлежит этот объект мне или его создал подключенный клиент. Именно поэтому нужно выносить управление отдельно (Hunjeth) ... Но судя по описанию функции Network.Instantiate доступ к корневым функциям объекта можно получить только если объект принадлежит мне. То есть не обязательно вычленять скрипт управления из префаба, нужно сделать чтобы обработка управления в данном скрипте запускалась из вне объекта, то есть убрать обработку из функции update() и создать например функцию GoGoGo(). Тогда обработка управления будет запускаться из вне следующим образом :

Код

     
   var newplayer : GameObject;
   var _soldierMovement : soldierMovement;
   function Start() {
                newplayer = Network.Instantiate(pgo, transform.position, transform.rotation, 0);
                _soldierMovement = newplayer.GetComponent(soldierMovement);
   }

   function Update() {
           _soldierMovement.GoGoGo();
   }


Пока у меня в голове каша ))) но поправьте если что не так я еще только во всем пытаюсь разобраться )))

Добавлено (29.12.2012, 09:49)
---------------------------------------------
Все таки удалось разделить управление не разрушая префаб (камера и скрипт управления игроком находится внутри префаба). Вот такой скрипт добавил префабу игрока:
Код

function OnNetworkInstantiate (msg : NetworkMessageInfo) {

   var camera : Transform = gameObject.transform.Find("smoothWorldPosition/soldierCamera");
   var crosshairenabled : Transform = gameObject.transform.Find("crosshair");
   // Это мой игрок
   if (networkView.isMine)
   {
    //Оставим его в покое
   }
   // Это подключенный игрок
   else
   {
    name += "Remote";
    GetComponent(soldierMovement).enabled = false;
    camera.GetComponent(Camera).enabled = false;
    crosshairenabled.GetComponent(crosshair).enabled = false;
   }
}


Хотя таким способом я не вижу анимацию на подключенном персонаже т.к. блокирую её ))), хотя персонаж перемещается )))

Добавлено (29.12.2012, 14:45)
---------------------------------------------
Для простоты изменил скрипт движения персонажа soldierMove (скрипт внутри префаба soldier). Вот главная часть кода:

Код
function Update () {

   
  var controller : CharacterController = GameObject.Find("soldier(Clone)").GetComponent(CharacterController);
  controller.Move( Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"))*0.03);
   
}


Теперь персонажи двигаются отдельно и видно анимацию по сети. НО!!! почему анимация подключенного игрока идет какими то рывками, а иногда и вообще пропадает ?!

Добавлено (29.12.2012, 16:10)
---------------------------------------------
проблема с рывками решена ))) http://unity3d.ru/distribution/viewtopic.php?f=14&t=10087

Сообщение отредактировал freeprogrammer - Сб, 29 Дек 2012, 10:16
 
Сообщениеприхожу к выводу, что нужно еще курить и курить Network.Instantiate )))
Но как я понимаю принцип следующий: если я создал объект видимый всем сетевым клиентам, то все скрипты находящиеся внутри данного объекта будут выполнятся одновременно на всех одинаковых объектах не зависимо от того принадлежит этот объект мне или его создал подключенный клиент. Именно поэтому нужно выносить управление отдельно (Hunjeth) ... Но судя по описанию функции Network.Instantiate доступ к корневым функциям объекта можно получить только если объект принадлежит мне. То есть не обязательно вычленять скрипт управления из префаба, нужно сделать чтобы обработка управления в данном скрипте запускалась из вне объекта, то есть убрать обработку из функции update() и создать например функцию GoGoGo(). Тогда обработка управления будет запускаться из вне следующим образом :

Код

     
   var newplayer : GameObject;
   var _soldierMovement : soldierMovement;
   function Start() {
                newplayer = Network.Instantiate(pgo, transform.position, transform.rotation, 0);
                _soldierMovement = newplayer.GetComponent(soldierMovement);
   }

   function Update() {
           _soldierMovement.GoGoGo();
   }


Пока у меня в голове каша ))) но поправьте если что не так я еще только во всем пытаюсь разобраться )))

Добавлено (29.12.2012, 09:49)
---------------------------------------------
Все таки удалось разделить управление не разрушая префаб (камера и скрипт управления игроком находится внутри префаба). Вот такой скрипт добавил префабу игрока:
Код

function OnNetworkInstantiate (msg : NetworkMessageInfo) {

   var camera : Transform = gameObject.transform.Find("smoothWorldPosition/soldierCamera");
   var crosshairenabled : Transform = gameObject.transform.Find("crosshair");
   // Это мой игрок
   if (networkView.isMine)
   {
    //Оставим его в покое
   }
   // Это подключенный игрок
   else
   {
    name += "Remote";
    GetComponent(soldierMovement).enabled = false;
    camera.GetComponent(Camera).enabled = false;
    crosshairenabled.GetComponent(crosshair).enabled = false;
   }
}


Хотя таким способом я не вижу анимацию на подключенном персонаже т.к. блокирую её ))), хотя персонаж перемещается )))

Добавлено (29.12.2012, 14:45)
---------------------------------------------
Для простоты изменил скрипт движения персонажа soldierMove (скрипт внутри префаба soldier). Вот главная часть кода:

Код
function Update () {

   
  var controller : CharacterController = GameObject.Find("soldier(Clone)").GetComponent(CharacterController);
  controller.Move( Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"))*0.03);
   
}


Теперь персонажи двигаются отдельно и видно анимацию по сети. НО!!! почему анимация подключенного игрока идет какими то рывками, а иногда и вообще пропадает ?!

Добавлено (29.12.2012, 16:10)
---------------------------------------------
проблема с рывками решена ))) http://unity3d.ru/distribution/viewtopic.php?f=14&t=10087


Автор - freeprogrammer
Дата добавления - 29 Дек 2012 в 16:10
  • Страница 1 из 1
  • 1
Поиск:
Загрузка...

Game Creating CommUnity © 2009 - 2025