Unity RPG游戏心得---设计模式

千锋:Unity RPG游戏从入门到实战全套教程_哔哩哔哩_bilibili

p6

知识回顾:

单例:

1:有且只有一个实例

只有static和const修饰的才是全局变量

模块类之间

总结:全程序有且只有一个类的实例

工厂模式

1:不关心生产过程

作用:用于new一些新的对象

工厂模式就是生产一些新的东西

1)生产金币

2)野怪

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class TestFactory{

    public TestFactory() {
        Initial();
    }


    Sprite[] allSprite;
    Transform parents;
    /// <summary>
    /// 加载资源
    /// </summary>
    public void Initial() {
       allSprite= Resources.LoadAll<Sprite>("Pig");
        //深度优先遍历
        parents = GameObject.FindGameObjectWithTag("MainCanvas").transform;
    }

    /// <summary>
    /// 动态创建Image
    /// </summary>
    /// <returns></returns>
    public GameObject CreateImage(int index,Vector3 pos) {
        //在内存中创建GameObject
        GameObject tmpObj = new GameObject();
        tmpObj.name = index.ToString();
        //设置parent
        //默认为世界坐标,所以默认为false
        tmpObj.transform.SetParent(parents, false);
        //改变图片顺序
        //tmpObj.transform.SetAsLastSibling();

        //大于2时逆序排列
        if(index>2)
        tmpObj.transform.SetSiblingIndex(2);
        //逆序排列
        //tmpObj.transform.SetAsFirstSibling();
        tmpObj.transform.localPosition = pos;
        //动态加载image
        Image tmpImage=tmpObj.AddComponent<Image>();

        index = index % allSprite.Length;
        tmpImage.sprite = allSprite[index];
        return tmpObj;
    }
}
 

使用:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class UseFactory : MonoBehaviour {

    TestFactory myFactory;
    // Use this for initialization
    void Start () {
        myFactory = new TestFactory();
    }


    int tmpCount = 0;
    // Update is called once per frame
    void Update () {
        if (Input.GetKeyDown(KeyCode.Space)) {
            tmpCount++;
            myFactory.CreateImage(tmpCount,Vector3.one*tmpCount*50);
;        }
    }
}

观察者模式:

1.不断询问

游戏开发:

1,播放一个大招 在0.5s时候播放一个音效

都是计时操作:

Time 累加

代理模式:

指向方法的指针

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using UnityEngine.Events;

public class HusBand {
    Wife myWife;

    public void AddMoney(Wife myWife) {
        myWife.LeadMoney();
    }

    public void Notice()
    {
        Debug.Log("my wife mama say bad word!!");
    }

    public void NoticeTwo()
    {
        Debug.Log("my wife mama say bad word again!!");
    }


}


public class Wife {

    public delegate void WifeSister();


    public WifeSister wifeSister;

    public void LeadMoney() {

    }

    public void SayBadWord() {
        wifeSister();
    }

 
}

public class TestDelegate : MonoBehaviour {

    // Use this for initialization
    void Start () {
        Wife tmpWife = new Wife();
        HusBand tmpHusband = new HusBand();
        
        tmpHusband.AddMoney(tmpWife);

        
        
        //多播
        tmpWife.wifeSister += tmpHusband.Notice;
        tmpWife.wifeSister += tmpHusband.NoticeTwo;

        tmpWife.SayBadWord();

    }
    
    // Update is called once per frame
    void Update () {
        
    }
}

策略者模式

根据不同的输入 能够得到不同的结果:

 多态的使用

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class AbsBase {
    public float payMoney;
    public virtual void CaculateTax() { }


}

public class AbsPerson : AbsBase {
    public override void CaculateTax()
    {       
        payMoney *= 0.08f;
    }

}

public class AbsCompany : AbsBase {
    public override void CaculateTax()
    {
        //base.CaculateTax();
        payMoney *= 0.12f;
    }    
}

//会计
public class TestAbstrator : MonoBehaviour {
    //会计
    public void CalculateTax(AbsBase tmpBase) {
        tmpBase.CaculateTax();
    }

    // Use this for initialization
    void Start () {
        AbsPerson tmpPerson = new AbsPerson();
        CalculateTax(tmpPerson);


        AbsCompany tmpCompaney = new AbsCompany();
        CalculateTax(tmpCompaney);
    }
    
    // Update is called once per frame
    void Update () {
        
    }
}
 

 建造者模式

 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class BuilderBoss {
    public static BuilderBoss instance;
    //构建一个单例
    public static BuilderBoss Instance {
        get {
            if (instance == null) {
                instance = new BuilderBoss();
            }
            return instance;
        }

    }


    ProjectLeader[] leaders;


    public void MakeMoney() {

    }

    public void MakeGame() {
        MakeMoney();
        for (int i=0;i<leaders.Length;i++) {
            leaders[i].RecvCommond();
        }
    }
}

public class ProjectLeader {
    BuilderEnginer[] enginers;

    public void RecvCommond()
    {
        JoinWorker();
    }

    public void JoinWorker() {
        for (int i = 0; i < enginers.Length; i++) {
            enginers[i].WriteCoding();
        }
    }
}

public class BuilderEnginer {
    public void WriteCoding() {

    }
}

public class TestBuilder : MonoBehaviour {

    // Use this for initialization
    void Start () {
        //不管底层是如何实现的
        BuilderBoss.Instance.MakeGame();
    }
    
    // Update is called once per frame
    void Update () {
        
    }
}

中介者模式

解决上下游关联性问题,符合最少知识原则(尽量少引用别人的内容)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class MiddleBase {
    public Transform owner;

    public float bloodCount;
    public virtual void ReduceBlood(float reduce) {
        bloodCount -= reduce;
    }
}

public class MiddleNPC:MiddleBase {
    public override void ReduceBlood(float reduce)
    {
        //base.ReduceBlood(reduce);
        bloodCount -= reduce * 3;
    }
}

public class MiddlePlayer:MiddleBase {

}

/// <summary>
/// pos1-pos2>r1+r2 相离
/// pos1-pos2=r1+r2 相切
/// pos1-pos2<r1+r2 相交
/// </summary>
public class TestMiddle : MonoBehaviour {

    public void CaculateBlood(MiddleBase attacker, MiddleBase attacked) {
        //Vector3 deltaPos = attacker.owner.position - attacked.owner.position;
        if (Vector3.Distance(attacker.owner.position, attacked.owner.position)<10) {
            attacked.ReduceBlood(10);
        }       
    }
    // Use this for initialization
    void Start () {
        MiddleNPC tmpNpc = new MiddleNPC();
        MiddlePlayer tmpPlayer = new MiddlePlayer();
        CaculateBlood(tmpNpc, tmpPlayer);
        CaculateBlood(tmpPlayer,tmpNpc);
    }
    
    // Update is called once per frame
    void Update () {
        
    }
}

猜你喜欢

转载自blog.csdn.net/renwen1579/article/details/124963072
今日推荐