找回密碼
 注冊帳號

掃一掃,訪問微社區

snakeek

Unity3D網絡游戲開發 Animation同步

熱度 127011 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 涂鴉板

您需要登錄后才可以評論 登錄 | 注冊帳號

送書《UE材質完全學習教程》!
极速时时彩开奖最快的网站