千锋: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 () {
}
}