- Home /
character customization animation sync problem in network
hello, i'm trying to use character customization example in my project, all seems to work well but i can't see animation changeing between idle and walk when the server was started, I have tryed with RPC but no luck. This is my modified fpsinputcontroller, it essentially set the character when the character was generated and play the animations when you move
private var motor : CharacterMotor;
var Character : GameObject;
var NetV : NetworkView;
// Use this for initialization
function Awake () {
motor = GetComponent(CharacterMotor);
}
// Update is called once per frame
function Update () {
// Get the input vector from kayboard or analog stick
var directionVector = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
if (directionVector != Vector3.zero) {
// Get the length of the directon vector and then normalize it
// Dividing by the length is cheaper than normalizing when we already have the length anyway
var directionLength = directionVector.magnitude;
directionVector = directionVector / directionLength;
// Make sure the length is no bigger than 1
directionLength = Mathf.Min(1, directionLength);
// Make the input vector more sensitive towards the extremes and less sensitive in the middle
// This makes it easier to control slow speeds when using analog sticks
directionLength = directionLength * directionLength;
// Multiply the normalized direction vector by the modified length
directionVector = directionVector * directionLength;
}
// Apply the direction to the CharacterMotor
motor.inputMoveDirection = transform.rotation * directionVector;
motor.inputJump = Input.GetButton("Jump");
SetCharacter();
networkView.RPC("AnimateCharacter", RPCMode.All);
//Add the character animation component to observed
NetV.observed = Character.animation;
}
// Require a character controller to be attached to the same game object
@script RequireComponent (CharacterMotor)
@script AddComponentMenu ("Character/FPS Input Controller")
function SetCharacter(){
//yield WaitForSeconds (4);
if (Character == null){
Character = gameObject.Find("female");
}
if (!gameObject.Find("female")){
Character = gameObject.Find("male");
}else{
return;
}
}
@RPC
function AnimateCharacter(info : NetworkMessageInfo){
if (Input.GetAxis("Vertical") && Input.GetAxis("Horizontal")){
Character.animation.CrossFade("walk");
}else{
Character.animation.CrossFade("idle1");
}
}
any suggestion will be very, very appreciated & sorry for my english
Answer by Julien-Lynge · Dec 21, 2011 at 06:40 PM
Michael, It doesn't look like you're actually sending any information with the RPC call. I think what you want to do is detect Input on your local copy, send this information over the network, and animate on the remote copy. What currently happens is that the remote copy receives the RPC call and checks its own Input - so it will only animate if it receives an RPC call AND gets input on the same frame. What you want to do is something like this:
bool gotInput = (Input.GetAxis("Vertical") || Input.GetAxis("Horizontal"))
networkView.RPC("AnimateCharacter", RPCMode.Others, gotInput);
//note that I changed RPCMode to others - setting to All will call us as well, which we clearly don't need to do since we already have the input information. I also changed the input to || from &&, since I'm assuming you don't want the user to have to press both simultaneously
then on the other side,
function AnimateCharacter(bool gotInput)
{
if (gotInput) { start the animation }
}
//I removed the NetworkMessageInfo (you're not using it, so you don't need it) and added the bool that you're passing on the other side.
Check out the Unity reference on RPC calls for more info.
thank you very much, but i still have a problem, it tells me that cannot convert float to boolean. In JS i have to create a boolean variable like this: var gotInput : boolean = (Input.GetAxis("Vertical") || Input.GetAxis("Horizontal")) or i have to create a function? Thanks for the help
The documentation states that GetAxis returns a float value between -1 and 1 (http://unity3d.com/support/documentation/ScriptReference/Input.GetAxis.html).
So you have to decide in what cases you want to run the animation. Is it any case where the input is not zero? If so, you need to check for Input.GetAxis("YourAxis") != 0. Do you want to add some threshold, like where input is greater than .5? Then you use > .5.
It sounds like it would be a wise investment for you to look around for sites and books on learning Javascript - these are very basic program$$anonymous$$g things that you need to learn to be able to work successfully in Unity.
yes, you're right, is actually what i'm doing, i tryed everything and the problem still remains. I think that the problem is that the character was spawned after the prefabs. I tryed to allocate viewID but nothing.. it's a mystery, it seems a xfiles. Thank you anyway
Your answer
Follow this Question
Related Questions
Unity networking tutorial? 6 Answers
Network Discovery is not working over multiple devices. 1 Answer
Persisting NetworkView across Scene change does not work 1 Answer
Networking problems 2 Answers