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;
скрипт управления должен быть на объекте который не виден в интернете тоесть не на игроке Input.. надо засунуть в другой скрипт и повесить на другой объект например гуи
Сообщение отредактировал Hunjeth - Пн, 24 Дек 2012, 05:52
я правильно понял: создам пустышку, повешу на неё скрипты управления Move, на объекте оставлю скрипты анимации. Или вообще убрать все скрипты визуальные с объекта? Т.к. объект создан префабом и на нем висит своя камера, движение и т.д., в сцене его нет. Появляется при подключении игрока с помощью скрипта (Spawn) - висит на пустышке.
скорей всего что Network.Instantiate значит что весь объект будет транслироваться в интернете тебе это и надо только управление должно быть отдельно должен быть еще 1 объект на сцене каторый будет упровлять игроком но не будет поставлен на сцену через Network.Instantiate
Сообщение отредактировал Hunjeth - Пн, 24 Дек 2012, 06:14
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
прихожу к выводу, что нужно еще курить и курить 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