這一章,我們需要用到我們框架的知識(shí),我們將人物的血量,攻擊力,速度,等一系列的數(shù)據(jù)統(tǒng)一起來。
首先在讓我們來了解一下框架,我們先不去考慮和服務(wù)器的調(diào)試的部分。
角色的數(shù)據(jù)我們將之存放在 MODELS之中,然后通過Signal來傳遞消息。
基礎(chǔ)的流程就是:
VIEW中發(fā)出一個(gè)signal去找MODELS要數(shù)據(jù),MODELS接收信號(hào)之后,將自己存儲(chǔ)的小姐姐數(shù)據(jù),傳遞給VIEW,然后VIEW實(shí)裝這部分?jǐn)?shù)據(jù)。而兩者的中間介質(zhì)就是Command的。

框架
首先我們來創(chuàng)建三個(gè)信號(hào)。我來創(chuàng)建一個(gè)PlayerDataSignal.cs的角色信號(hào)類
using strange.extensions.signal.impl;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerBaseDataSignal:Signal<float ,float >{//models向playerView發(fā)送基礎(chǔ)數(shù)據(jù)。
}
public class CallMadelPlyerBaseDataSignal:Signal {//View向models發(fā)送想要獲取基礎(chǔ)數(shù)據(jù)的請求
}
public class PlayerCommandSignal:Signal {//用于創(chuàng)建PlayerCommandSignal對象
}
創(chuàng)建一個(gè)IPlayerModel的接口。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public interface IPlayerModel {
float speed { get; set; }
float jumpPower { get; set;}
CallMadelPlyerBaseDataSignal callMadelPlyerBaseDataSignal { get;}
}
創(chuàng)建一個(gè)繼承了IPlayerModel的類PlayerModel。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerModel:IPlayerModel {
// Use this for initialization
public float speed { get; set; } = 1;//暫定數(shù)據(jù)
public float jumpPower { get; set; } = 3.5f;//暫定數(shù)據(jù)
[Inject]
public CallMadelPlyerBaseDataSignal callMadelPlyerBaseDataSignal { get; set; }
public PlayerModel() {
}
}
關(guān)于中間層PlayerCommand的處理:
using strange.extensions.command.impl;
using strange.extensions.context.api;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//開始命令
public class PlayerCommand:Command {
[Inject(ContextKeys.CONTEXT_VIEW)]
public GameObject contextView { get; set; }//獲得上一層的長官
[Inject]
public IPlayerModel model { get; set; }
[Inject]
public PlayerBaseDataSignal playerBaseDataSignal { get; set; }
public override void Execute() {
//Retain();
Debug.Log("PlayerCommand Execute.....");
model.callMadelPlyerBaseDataSignal.AddListener(onComplete);
}
public override void Release() {
Debug.Log("PlayerCommand Release.....");
model.callMadelPlyerBaseDataSignal.RemoveListener(onComplete);
}
private void onComplete() {
Debug.Log("獲得通知,開始找尋model中的數(shù)據(jù)用于回調(diào)");
playerBaseDataSignal.Dispatch(model.speed,model.jumpPower);
// Release();
}
}
StartCommand喚醒playerCommand
public class StartCommand:Command {
// Use this for initialization
void Start() {
}
[Inject]
public PlayerCommandSignal playerCommandSignal { get; set; }//用于創(chuàng)建中間層實(shí)例
public override void Execute() {
Debug.Log("StartCommand");
playerCommandSignal.Dispatch();//建立palyercommand的實(shí)例對象。
}
// Update is called once per frame
}
信號(hào)的注冊和綁定TestContext:
protected override void mapBindings() {
//model
injectionBinder.Bind<IPlayerModel>().To<PlayerModel>().ToSingleton();
mediationBinder.Bind<PlayerTestView>().To<PlayerTestMediator>();
commandBinder.Bind<StartSignal>().To<StartCommand>();
commandBinder.Bind<PlayerCommandSignal>().To<PlayerCommand>();//綁定回調(diào)
injectionBinder.Bind<PlayerBaseDataSignal>().ToSingleton();//注冊信號(hào)
injectionBinder.Bind<CallMadelPlyerBaseDataSignal>().ToSingleton();//注冊信號(hào)
}
處理完了這些,我們就要去Mediator層去發(fā)送和接受信號(hào)了。
using strange.extensions.mediation.impl;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerTestMediator:Mediator {
// Use this for initialization
//test
float up = 0;
float right = 0;
Vector3 vec;
[Inject]
public PlayerTestView playerView { get; set; }
[Inject]
public PlayerBaseDataSignal playerBaseDataSignal { get; set; }//返回給我們的帶著數(shù)據(jù)的信號(hào)
[Inject]
public CallMadelPlyerBaseDataSignal callMadelPlyerBaseDataSignal { get; set; }//發(fā)出我想要數(shù)據(jù)的信號(hào)。
[Inject]
public PlayerCommandSignal playerCommandSignal { get; set; }//用于創(chuàng)建中間層實(shí)例
public override void OnRegister() {//綁定成功之后會(huì)調(diào)用這個(gè)API
Debug.Log("OnRegister");
playerView.init();
playerBaseDataSignal.AddListener(setPlayerData);//獲得返回?cái)?shù)據(jù)的監(jiān)聽函數(shù)
callMadelPlyerBaseDataSignal.Dispatch();//在playerView基礎(chǔ)組件初始化完成之后,開始去想models層獲取數(shù)據(jù)。
UpdateManges.add_playerEventList_(keyController);
UpdateManges.add_playerEventList_(playerAction);
UpdateManges.add_playerEventList_Fix(accurateDetection);
UpdateManges.add_playerEventList_Late(cameraContorller);
}
public override void OnRemove() {//解除綁定之后調(diào)用這個(gè)API
Debug.Log("OnRemove");
playerBaseDataSignal.RemoveListener(setPlayerData);
UpdateManges.sub_playerEventList_(keyController);
UpdateManges.sub_playerEventList_(playerAction);
UpdateManges.sub_playerEventList_(accurateDetection);
UpdateManges.sub_playerEventList_Late(cameraContorller);
}
bool run = false;
bool jump = false;
void keyController() {
float targetup = (Input.GetKey("w") ? 1 : 0) - (Input.GetKey("s") ? 1 : 0);
float targetright = (Input.GetKey("d") ? 1 : 0) - (Input.GetKey("a") ? 1 : 0);
//up = Mathf.SmoothDamp(up, targetup, ref upVelocity, 0.1f);
//right = Mathf.SmoothDamp(right, targetright, ref rightVelocity, 0.1f);
up = Mathf.Lerp(up, targetup,0.6f);
right = Mathf.Lerp(right, targetright, 0.6f);
if (Input.GetKeyDown(KeyCode.LeftShift)) {
run = !run;
}
jump = Input.GetKey(KeyCode.Space);
}
void cameraContorller() {//加入LateUpdate不斷跟新
playerView.cameraFollow();
}
void playerAction() {//加入update不斷跟新
playerView.baseWalkRun(right, up, run);
playerView.startJump(jump);
playerView.playerMove();
}
void accurateDetection() {//加入fixUpdate不斷跟新
playerView.colliderTesting();
//playerView.playerMove();
//playerView.userGavity();
}
void setPlayerData(float speed,float jumpPower) {
Debug.Log("開始設(shè)置角色數(shù)據(jù)speed:"+speed.ToString()+" jumpPower:" +jumpPower.ToString());
}
}
完成之后讓我們運(yùn)行一下吧。

檢測
最后我們只需要將最后得到的數(shù)據(jù)給小姐姐設(shè)置上就OK了,這樣就能有效的控制小姐姐的身體機(jī)能了,以后的技能,血量,穿著服飾等等的數(shù)據(jù)都是這樣的基礎(chǔ)結(jié)構(gòu)上的擴(kuò)充。
上一節(jié)
下一節(jié)