從零開始的RPG制作7.1-(人物數(shù)據(jù)剝離,統(tǒng)一管理)

這一章,我們需要用到我們框架的知識(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é)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容