找回密码
 注册帐号

扫一扫,访问微社区

snakeek

Unity3D网络游戏开发 Animation同步

热度 126737 2014-3-3 21:36 |个人分类:Unity3D| 网络游戏, 开发, 动画, 同步

本篇的主要内容是介绍下是如何进行同步,耽搁了很久很久,实在汗颜。。。
之前的文章中有介绍过Animator的同步,参考:http://www.unitymanual.com/home.php?mod=space&uid=3991&do=blog&id=197

好,下面进入正题。
首先,运行效果截图:

可以看到,一个是跑步动画,一个是行走动画,服务器和客户端进行了完整的同步。


因为整体比较简单,下面直接上代码,对重点逻辑段进行简要说明:

AnimationTest:

using UnityEngine;
using System.Collections;

public class AnimationTest : MonoBehaviour {

	public NetworkPlayer ownerPlayer;
	public const string _01 = "idle";
	public const string ANIMATION_02 = "run";
	public const string ANIMATION_03 = "walk";
	public const string ANIMATION_04 = "jump_pose";

	private string anim = "";

	void Start () {
	
		gameObject.animation.wrapMode = WrapMode.Loop;
	}
	
	void Update () {
	
		if (ownerPlayer != null && Network.player == ownerPlayer) {

			if (Input.GetKeyDown(KeyCode.A)) {
				anim = ANIMATION_01;
			}
			else if (Input.GetKeyDown(KeyCode.S)) {
				anim = ANIMATION_02;
			}
			else if (Input.GetKeyDown(KeyCode.D)) {
				anim = ANIMATION_03;
			}
			else if (Input.GetKeyDown(KeyCode.F)) {
				anim = ANIMATION_04;
			}
		}

		if (Network.isServer) {		
			PlayAnimation(anim);
		}
		else if (Network.isClient) {
			networkView.RPC("PlayAnimation", RPCMode.Server, anim);
		} 
	}

	[RPC]
	void PlayAnimation(string animName) {
		if (string.IsNullOrEmpty(animName)) {
			return;
		}
		gameObject.animation.Play(animName);
		networkView.RPC("ClientPlayAnimation", RPCMode.OthersBuffered, animName);
	}

	[RPC]
	void ClientPlayAnimation(string animName) {

		if (string.IsNullOrEmpty(animName)) {
			return;
		}
		gameObject.animation.Play(animName);
	}

	[RPC]
	void SetPlayer(NetworkPlayer player) {
		
		ownerPlayer = player;
		
		if (player == Network.player) {
			
			enabled = true;
		}
	}
}

可以看到,使用的是Character Controller包的工人模型,自带发呆,跑步,行走等动画。

首先,在Update方法中进行按键判断,并记录对应的动画名称,通过下面的代码段:

		if (Network.isServer) {		
			PlayAnimation(anim);
		}
		else if (Network.isClient) {
			networkView.RPC("PlayAnimation", RPCMode.Server, anim);
		} 

来将动画名称统一发送到服务器端的PlayAnimation方法进行处理

接着,在PlayAnimation方法中,播放此动画。

最后,通过RPC方法调用ClientPlayAnimation方法,将播放的动画名称发送到各个客户端并进行播放。

上面就是同步Animation的方法,其他没说到的代码存在疑问的话,请参考:http://www.unitymanual.com/home.php?mod=space&uid=3991&do=blog&id=197


接下来,会进入到服务器开发的学习中,随着学习的渐进,不定期会放出各部分的心得与分享。


Over~


发表评论 评论 (4 个评论)

回复 baobaoxiaoxuan 2014-3-4 20:20
谢谢了
回复 snakeek 2014-3-4 20:27
baobaoxiaoxuan: 谢谢了
   拖了这么久,我都惭愧死了。。。
回复 HenryT 2014-3-5 09:26
写的不错!
回复 jbcashhk 2014-3-10 10:04
谢谢了

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册帐号