Unity游戲開發(fā)之炸彈人游戲的實(shí)現(xiàn)_第1頁(yè)
Unity游戲開發(fā)之炸彈人游戲的實(shí)現(xiàn)_第2頁(yè)
Unity游戲開發(fā)之炸彈人游戲的實(shí)現(xiàn)_第3頁(yè)
Unity游戲開發(fā)之炸彈人游戲的實(shí)現(xiàn)_第4頁(yè)
Unity游戲開發(fā)之炸彈人游戲的實(shí)現(xiàn)_第5頁(yè)
已閱讀5頁(yè),還剩21頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第Unity游戲開發(fā)之炸彈人游戲的實(shí)現(xiàn)目錄前言制作思路開始制作第一步:游戲場(chǎng)景制作第二步:墻體代碼第三步:炸彈人制作第四步:炸彈處理第五步:敵人制作第六步:游戲控制器第七步:UI控制器

前言

大家小時(shí)候肯定玩過(guò)這款游戲,炸彈人也算是經(jīng)典中的經(jīng)典啦~

希望看到這篇小游戲,可以讓你重拾童年跟小伙伴一起對(duì)著大屁股電視機(jī)玩游戲的美好時(shí)光!

時(shí)間在慢慢的流逝,那些陪你一起度過(guò)童年的小伙伴有多久沒(méi)聯(lián)系了呢~

看完這篇炸彈人,有時(shí)間的話就找自己童年的小伙伴們聊會(huì)天吧,一起找回童年的回憶和夢(mèng)想!

回歸主題,炸彈人小游戲制作開始!

來(lái)看一下炸彈人小游戲的效果吧!

制作思路

老規(guī)矩,做之前我們先來(lái)整一下做這個(gè)小游戲的思路讓我們動(dòng)一下腦袋瓜想一下一個(gè)炸彈人小游戲里面都有什么東西呢

首先要有一個(gè)游戲場(chǎng)景,這個(gè)場(chǎng)景就是我們?cè)谟螒蜻\(yùn)行的時(shí)候,我們可以看到的地方這個(gè)場(chǎng)景中會(huì)有許多墻體,其中四周會(huì)有一個(gè)游戲邊緣墻體,這些墻體是無(wú)法被我們的炸彈毀掉的,稱他為超級(jí)墻體!場(chǎng)景里面也會(huì)有一些墻體,可以被摧毀,我們成為普通墻體~有些是固定的,有些是可被摧毀的,這就是一個(gè)經(jīng)典的炸彈人玩法了!其次,我們要有一個(gè)主角,就是我們的炸彈人!我們的主角可以上下左右移動(dòng),然后還可以下蛋,就是放炸彈,炸敵人然后還要有血量等等當(dāng)然少不了敵人了,我們給場(chǎng)景中加入一個(gè)可以隨機(jī)左右移動(dòng)的敵人,碰到我們之后就會(huì)讓我們掉血這也是一個(gè)最經(jīng)典而且基礎(chǔ)的玩法啦~

乍一想好像也就這么點(diǎn)東西,也不是很難的樣子

那我們現(xiàn)在就開始動(dòng)手操作吧!

開始制作

導(dǎo)入素材資源包導(dǎo)入后,工程資源是這樣的

其中有一些精靈圖片素材,為我們做主角、敵人和墻體時(shí)候使用

還有幾個(gè)簡(jiǎn)單的聲音特效和動(dòng)畫特效,為我們的游戲制作提供后勤支援!

第一步:游戲場(chǎng)景制作

我們是一個(gè)2D游戲,在這里的游戲場(chǎng)景中,地圖是精靈圖片做的我們這里寫個(gè)腳本,讓他在游戲運(yùn)行時(shí),直接生成相應(yīng)的地圖這里是用了一個(gè)對(duì)象池腳本ObjectPool,用來(lái)拿到工程中所有的資源,然后需要使用的時(shí)候從對(duì)象池生成到場(chǎng)景中這里就不多介紹對(duì)象池了,方法有很多種這里提供一種作為參考,可直接掛到場(chǎng)景中使用即可

上代碼:

publicenumObjectType

SuperWall,

Wall,

Prop,

Bomb,

Enemy,

BombEffect

[System.Serializable]

publicclassType_Prefab

publicObjectTypetype;

publicGameObjectprefab;

publicclassObjectPool:MonoBehaviour

publicstaticObjectPoolInstance;

publicListType_Prefabtype_Prefabs=newListType_Prefab

///summary

///通過(guò)物體類型獲取該預(yù)制體

////summary

///paramname="type"/param

///returns/returns

privateGameObjectGetPreByType(ObjectTypetype)

foreach(varitemintype_Prefabs)

if(item.type==type)

returnitem.prefab;

returnnull;

///summary

///物體類型和對(duì)應(yīng)的對(duì)象池關(guān)系字典

////summary

privateDictionaryObjectType,ListGameObjectdic=

newDictionaryObjectType,ListGameObject();

privatevoidAwake()

Instance=this;

///summary

///通過(guò)物體類型從相對(duì)應(yīng)的對(duì)象池中取東西

////summary

///paramname="type"/param

///returns/returns

publicGameObjectGet(ObjectTypetype,Vector2pos)

GameObjecttemp=null;

//判斷字典中有沒(méi)有與該類型匹配的對(duì)象池,沒(méi)有則創(chuàng)建

if(dic.ContainsKey(type)==false)

dic.Add(type,newListGameObject

//判斷該類型對(duì)象池中有沒(méi)有物體

if(dic[type].Count0)

intindex=dic[type].Count-1;

temp=dic[type][index];

dic[type].RemoveAt(index);

else

GameObjectpre=GetPreByType(type);

if(pre!=null)

temp=Instantiate(pre,transform);

temp.SetActive(true);

temp.transform.position=pos;

temp.transform.rotation=Quaternion.identity;

returntemp;

///summary

///回收

////summary

///paramname="type"/param

publicvoidAdd(ObjectTypetype,GameObjectgo)

//判斷該類型是否有對(duì)應(yīng)的對(duì)象池以及對(duì)象池中不存在該物體

if(dic.ContainsKey(type)dic[type].Contains(go)==false)

//放入對(duì)象池

dic[type].Add(go);

go.SetActive(false);

}

有了這個(gè)簡(jiǎn)單的對(duì)象池之后,我們?cè)賹懸粋€(gè)腳本MapController來(lái)生成場(chǎng)景中的一些墻體通過(guò)兩個(gè)二維向量列表來(lái)生成普通墻體和超級(jí)墻體

我們需要給預(yù)制體標(biāo)記不同的Tag用于區(qū)分它們各自的屬性

將以下預(yù)制體都添加上,只有墻體需要添加layer層,后面在怪物隨機(jī)移動(dòng)時(shí)會(huì)用到,其他的只需要添加Tag即可

上代碼:

publicclassMapController:MonoBehaviour

publicGameObjectdoorPre;

publicintX,Y;

privateListVector2nullPointsList=newListVector2

privateListVector2superWallPointList=newListVector2

privateGameObjectdoor;

//表示從對(duì)象池中取出來(lái)的所有物體集合

privateDictionaryObjectType,ListGameObjectpoolObjectDic=

newDictionaryObjectType,ListGameObject();

///summary

///判斷當(dāng)前位置是否是實(shí)體墻

////summary

///paramname="pos"/param

///returns/returns

publicboolIsSuperWall(Vector2pos)

if(superWallPointList.Contains(pos))

returntrue;

returnfalse;

publicVector2GetPlayerPos()

returnnewVector2(-(X+1),(Y-1));

privatevoidRecovery()

nullPointsList.Clear();

superWallPointList.Clear();

foreach(variteminpoolObjectDic)

foreach(varobjinitem.Value)

ObjectPool.Instance.Add(item.Key,obj);

poolObjectDic.Clear();

publicvoidInitMap(intx,inty,intwallCount,intenemyCount)

Recovery();

X=x;

Y=y;

CreateSuperWall();

FindNullPoints();

CreateWall(wallCount);

CreateDoor();

CreateProps();

CreateEnemy(enemyCount);

///summary

///生成實(shí)體墻

////summary

privatevoidCreateSuperWall()

for(intx=-X;xx+=2)

for(inty=-Y;yy+=2)

SpawnSuperWall(newVector2(x,y));

for(intx=-(X+2);xx++)

SpawnSuperWall(newVector2(x,Y));

SpawnSuperWall(newVector2(x,-(Y+2)));

for(inty=-(Y+1);y=Y-1;y++)

SpawnSuperWall(newVector2(-(X+2),y));

SpawnSuperWall(newVector2(X,y));

privatevoidSpawnSuperWall(Vector2pos)

superWallPointList.Add(pos);

GameObjectsuperWall=ObjectPool.Instance.Get(ObjectType.SuperWall,pos);

if(poolObjectDic.ContainsKey(ObjectType.SuperWall)==false)

poolObjectDic.Add(ObjectType.SuperWall,newListGameObject

poolObjectDic[ObjectType.SuperWall].Add(superWall);

///summary

///查找地圖中所有的空點(diǎn)

////summary

privatevoidFindNullPoints()

for(intx=-(X+1);x=(X-1);x++)

if(-(X+1)%2==x%2)

for(inty=-(Y+1);y=(Y-1);y++)

nullPointsList.Add(newVector2(x,y));

else

for(inty=-(Y+1);y=(Y-1);y+=2)

nullPointsList.Add(newVector2(x,y));

nullPointsList.Remove(newVector2(-(X+1),(Y-1)));//將左上角第一個(gè)位置空出來(lái),用來(lái)生成炸彈人(出生點(diǎn))

nullPointsList.Remove(newVector2(-(X+1),(Y-2)));//左上角第一個(gè)位置下面的位置,保證炸彈人能出來(lái),不被自己炸死

nullPointsList.Remove(newVector2(-X,(Y-1)));//左上角第一個(gè)位置右邊的位置,保證炸彈人能出來(lái),不被自己炸死

///summary

///創(chuàng)建可以銷毀的墻

////summary

privatevoidCreateWall(intwallCount)

if(wallCount=nullPointsList.Count)

wallCount=(int)(nullPointsList.Count*0.7f);

for(inti=0;iwallCount;i++)

intindex=Random.Range(0,nullPointsList.Count);

GameObjectwall=ObjectPool.Instance.Get(ObjectType.Wall,nullPointsList[index]);

nullPointsList.RemoveAt(index);

if(poolObjectDic.ContainsKey(ObjectType.Wall)==false)

poolObjectDic.Add(ObjectType.Wall,newListGameObject

poolObjectDic[ObjectType.Wall].Add(wall);

privatevoidCreateProps()

intcount=Random.Range(0,2+(int)(nullPointsList.Count*0.05f));

for(inti=0;icount;i++)

intindex=Random.Range(0,nullPointsList.Count);

GameObjectprop=ObjectPool.Instance.Get(ObjectType.Prop,nullPointsList[index]);

nullPointsList.RemoveAt(index);

if(poolObjectDic.ContainsKey(ObjectType.Prop)==false)

poolObjectDic.Add(ObjectType.Prop,newListGameObject

poolObjectDic[ObjectType.Prop].Add(prop);

}

該腳本中,通過(guò)使用二維向量列表來(lái)生成墻體,并且生成之前判斷當(dāng)前位置是否已經(jīng)有物體存在在一初始化地圖的時(shí)候,先將列表清空,再執(zhí)行其他操作然后我們新建一個(gè)GameController物體并掛載上GameController腳本該腳本就是后面需要的游戲控制器,但是我們現(xiàn)在只讓他生成游戲地圖

上代碼:

///summary

///關(guān)卡控制器

////summary

privatevoidLevelCtrl()

time=levelCount*50+130;

intx=6+2*(levelCount/3);

inty=3+2*(levelCount/3);//每3關(guān)增加2個(gè)

if(x18)

x=18;

if(y15)

y=15;

enemyCount=(int)(levelCount*1.5f)+1;

if(enemyCount40)

enemyCount=40;

mapController.InitMap(x,y,x*y,enemyCount);

if(player==null)

player=Instantiate(playerPre);

playerCtrl=player.GetComponentPlayerCtrl

playerCtrl.Init(1,3,2);

playerCtrl.ResetPlayer();

player.transform.position=mapController.GetPlayerPos();

//回收?qǐng)鼍爸袣埩舻谋ㄌ匦?/p>

GameObject[]effects=GameObject.FindGameObjectsWithTag(Tags.BombEffect);

foreach(varitemineffects)

ObjectPool.Instance.Add(ObjectType.BombEffect,item);

Camera.main.GetComponentCameraFollow().Init(player.transform,x,y);

levelCount++;

UIController.Instance.PlayLevelFade(levelCount);

publicboolIsSuperWall(Vector2pos)

returnmapController.IsSuperWall(pos);

}

一個(gè)簡(jiǎn)單地圖隨機(jī)生成后是這樣的~

第二步:墻體代碼

我們上一步中只是生成了地圖中的墻體,在這些游戲?qū)ο笊砩隙歼€要掛上一個(gè)腳本,才能讓他們各司其職因?yàn)檫@些墻體他們的職責(zé)是有所不同的!

比如普通墻體身上的腳本W(wǎng)all代碼:

publicclassWall:MonoBehaviour

privatevoidOnTriggerEnter2D(Collider2Dcollision)

if(collision.CompareTag(Tags.BombEffect))

ObjectPool.Instance.Add(ObjectType.Wall,gameObject);

}

門Door身上的腳本,這個(gè)還有些特殊,因?yàn)樗婚_始是墻體,被我們用炸彈炸掉之后會(huì)變成通往下一關(guān)的門~這也是炸彈人的經(jīng)典玩法啦!

看一下Door腳本代碼!

publicSpritedoorSprite,defaultSp;

privateSpriteRendererspriteRenderer;

privatevoidAwake()

spriteRenderer=GetComponentSpriteRenderer

defaultSp=spriteRenderer.sprite;

publicvoidResetDoor()

tag="Wall";

gameObject.layer=8;

spriteRenderer.sprite=defaultSp;

GetComponentCollider2D().isTrigger=false;

privatevoidOnTriggerEnter2D(Collider2Dcollision)

if(collision.CompareTag(Tags.BombEffect))

tag="Untagged";

gameObject.layer=0;

spriteRenderer.sprite=doorSprite;

GetComponentCollider2D().isTrigger=true;

if(collision.CompareTag(Tags.Player))

//判斷當(dāng)前場(chǎng)景中的敵人是否都消滅了

GameController.Instance.LoadNextLevel();

}

第三步:炸彈人制作

經(jīng)過(guò)上面的地圖制作,我們就有了一個(gè)可以玩的場(chǎng)景了那接下來(lái)當(dāng)然是要添加主角炸彈人啦!雖然我們的炸彈人只是一個(gè)紙片人,但是不影響我們丟炸彈炸敵人哈哈~本游戲中的炸彈人是通過(guò)游戲控制器自動(dòng)生成的,我們需要在角色身上掛載一個(gè)腳本,讓他控制炸彈人的移動(dòng)和丟炸彈的方法

上腳本PlayerCtrl代碼

///summary

///移動(dòng)方法

////summary

privatevoidMove()

floath=Input.GetAxis("Horizontal");

floatv=Input.GetAxis("Vertical");

anim.SetFloat("Horizontal",h);

anim.SetFloat("Vertical",v);

rig.MovePosition(transform.position+newVector3(h,v)*speed);

privatevoidCreateBomb()

if(Input.GetKeyDown(KeyCode.Space)bombCount0)

AudioController.Instance.PlayFire();

bombCount--;

GameObjectbomb=ObjectPool.Instance.Get(ObjectType.Bomb,

newVector3(Mathf.RoundToInt(transform.position.x),

Mathf.RoundToInt(transform.position.y)));

bomb.GetComponentBomb().Init(range,bombBoomTime,()=

bombCount++;

bombList.Remove(bomb);

bombList.Add(bomb);

}

然后炸彈人身上還有一個(gè)動(dòng)畫控制器,用于炸彈人上下左右移動(dòng)時(shí)分別播放不同的動(dòng)畫

資源包中動(dòng)畫片段都有,我們來(lái)設(shè)置上就好了,很簡(jiǎn)單的動(dòng)畫片段執(zhí)行

動(dòng)畫片段切換時(shí)的效果:

一個(gè)場(chǎng)景中簡(jiǎn)單的移動(dòng)效果:

還有角色死亡時(shí)播放動(dòng)畫的方法代碼

///summary

///播放結(jié)束動(dòng)畫

////summary

publicvoidPlayDieAnim()

Time.timeScale=0;

anim.SetTrigger("Die");

///summary

///結(jié)束動(dòng)畫播放完畢

////summary

privatevoidDieAnimFinish()

GameController.Instance.GameOver();

}

死亡動(dòng)畫效果:

第四步:炸彈處理

現(xiàn)在我們炸彈人有了,炸彈的預(yù)制體也有了,就是那一張精靈圖片~然后現(xiàn)在我們需要掛載上腳本才能讓炸彈有一個(gè)向四周爆炸的效果!

炸彈身上有一個(gè)腳本Bomb,初始化方法Init在PlayerCtrl中炸彈人丟炸彈的時(shí)候被調(diào)用!腳本中的DealyBoom方法用于處理被我們的炸彈人丟出來(lái)以后檢閱四周可爆炸的范圍~

然后炸彈爆炸后也有一個(gè)預(yù)制體,我們也需要在上面掛載一個(gè)腳本,讓他在炸彈爆炸后執(zhí)行一個(gè)爆炸效果!

上腳本Bomb和BombEffect:

publicclassBomb:MonoBehaviour

privateintrange;

privateActionaniFinAction;

publicvoidInit(intrange,floatdealyTime,Actionaction)

this.range=range;

StartCoroutine("DealyBoom",dealyTime);

aniFinAction=action;

IEnumeratorDealyBoom(floattime)

yieldreturnnewWaitForSeconds(time);

if(aniFinAction!=null)

aniFinAction();

AudioController.Instance.PlayBoom();

ObjectPool.Instance.Get(ObjectType.BombEffect,transform.position);

Boom(Vector2.left);

Boom(Vector2.right);

Boom(Vector2.down);

Boom(Vector2.up);

ObjectPool.Instance.Add(ObjectType.Bomb,gameObject);

privatevoidBoom(Vector2dir)

for(inti=1;i=range;i++)

Vector2pos=(Vector2)transform.position+dir*i;

if(GameController.Instance.IsSuperWall(pos))

break;

ObjectPool.Instance.Get(ObjectType.BombEffect,pos);

}

publicclassBombEffect:MonoBehaviour

privateAnimatoranim;

privatevoidAwake()

anim=GetComponentAnimator

privatevoidUpdate()

AnimatorStateInfoinfo=anim.GetCurrentAnimatorStateInfo(0);

if(info.normalizedTime=1info.IsName("BombEffect"))

ObjectPool.Instance.Add(ObjectType.BombEffect,gameObject);

}

第五步:敵人制作

既然場(chǎng)景和主角都有了,那自然需要?jiǎng)?chuàng)建敵人啦我們將敵人生成也放在控制墻體生成的腳本中,因?yàn)閿橙艘部梢运闶且粋€(gè)可以移動(dòng)的墻體只不過(guò)我們給他不一樣的素材,讓他比墻體變得特殊了而已所以我們?cè)贛apController中新加入一個(gè)方法,用于生成敵人

生成敵人代碼

privatevoidCreateEnemy(intcount)

for(inti=0;icount;i++)

intindex=Random.Range(0,nullPointsList.Count);

GameObjectenemy=ObjectPool.Instance.Get(ObjectType.Enemy,nullPointsList[index]);

enemy.GetComponentEnemyAI().Init();

nullPointsList.RemoveAt(index);

if(poolObjectDic.ContainsKey(ObjectType.Enemy)==false)

poolObjectDic.Add(ObjectType.Enemy,newListGameObject

poolObjectDic[ObjectType.Enemy].Add(enemy);

}

然后敵人生成以后還要可以自由移動(dòng),然后尋找我們的炸彈人,只要碰到我們的炸彈人,炸彈人就會(huì)受到傷害這里需要注意的細(xì)節(jié)還是挺多的,首先我們需要讓他上下左右隨機(jī)移動(dòng)移動(dòng)是通過(guò)射線檢測(cè)來(lái)判斷的,這里我們給場(chǎng)景中的墻體的layer設(shè)置成8層然后怪物在檢測(cè)的時(shí)候,只檢測(cè)第八層的物體來(lái)判斷自身是否可以向該方向移動(dòng)還要處理敵人在碰到炸彈人和他們的同類時(shí),會(huì)改變自身的顏色,這樣會(huì)有一個(gè)簡(jiǎn)單的視覺(jué)交互效果

上腳本EnemyAI腳本代碼

publicclassEnemyAI:MonoBehaviour

privatefloatspeed=0.04f;

privateRigidbody2Drig;

privateSpriteRendererspriteRenderer;

privateColorcolor;

///summary

///方向:0上1下2左3右

////summary

privateintdirId=0;

privateVector2dirVector;

privatefloatrayDistance=0.7f;

privateboolcanMove=true;//是否可以移動(dòng)

privatevoidAwake()

spriteRenderer=GetComponentSpriteRenderer

color=spriteRenderer.color;

rig=GetComponentRigidbody2D

///summary

///初始化方法

////summary

publicvoidInit()

color.a=1;//當(dāng)敵人穿過(guò)后離開時(shí),恢復(fù)之前顏色

spriteRenderer.color=color;

canMove=true;

InitDir(Random.Range(0,4));

///summary

///初始化敵人方向

////summary

///paramname="dir"/param

privatevoidInitDir(intdir)

dirId=dir;

switch(dirId)

case0:

dirVector=Vector2.up;

break;

case1:

dirVector=Vector2.down;

break;

case2:

dirVector=Vector2.left;

break;

case3:

dirVector=Vector2.right;

break;

default:

break;

privatevoidUpdate()

if(canMove)

rig.MovePosition((Vector2)transform.position+dirVector*speed);

else

ChangeDir();

privatevoidOnTriggerEnter2D(Collider2Dcollision)

//消滅敵人

if(collision.CompareTag(Tags.BombEffect)gameObject.activeSelf)

GameController.Instance.enemyCount--;

ObjectPool.Instance.Add(ObjectType.Enemy,gameObject);

if(collision.CompareTag(Tags.Enemy))

color.a=0.3f;//當(dāng)敵人相互穿過(guò)時(shí),改變其顏色為半透明

spriteRenderer.color=color;

if(collision.CompareTag(Tags.SuperWall)||collision.CompareTag(Tags.Wall))

//復(fù)位

transform.position=newVector2(Mathf.RoundToInt(transform.position.x),

Mathf.RoundToInt(transform.position.y));//RoundToInt取整

ChangeDir();

privatevoidOnTriggerStay2D(Collider2Dcollision)

if(collision.CompareTag(Tags.Enemy))

color.a=0.3f;//當(dāng)敵人在一塊時(shí),改變其顏色為半透明

spriteRenderer.color=color;

privatevoidOnTriggerExit2D(Collider2Dcollision)

if(collision.CompareTag(Tags.Enemy))

color.a=1;//當(dāng)敵人穿過(guò)后離開時(shí),恢復(fù)之前顏色

spriteRenderer.color=color;

privatevoidChangeDir()

ListintdirList=newListint

if(Physics2D.Raycast(transform.position,Vector2.up,rayDistance,18)==false)

//1左移8,表示只檢測(cè)第8層(添加Layer)。若是08則表示忽略第8層

dirList.Add(0);//如果上方?jīng)]有檢測(cè)到物體就向上方移動(dòng)

if(Physics2D.Raycast(transform.position,Vector2.down,rayDistance,18)==false)

dirList.Add(1);

if(Physics2D.Raycast(transform.position,Vector2.left,rayDistance,18)==false)

dirList.Add(2);

if(Physics2D.Raycast(transform.position,Vector2.right,rayDistance,18)==false)

dirList.Add(3);

if(dirList.Count0)

canMove=true;

intindex=Random.Range(0,dirList.Count);

InitDir(dirList[index]);

else

canMove=false;

privatevoidOnDrawGizmos()

Gizmos.color=Color.red;

Gizmos.DrawLine(transform.position,transform.position+newVector3(0,rayDistance,0));

Gizmos.color=Color.blue;

Gizmos.DrawLine(transform.position,transform.position+newVector3(0,-rayDistance,0));

Gizmos.DrawLine(transform.position,transform.position+newVector3(-rayDistance,0,0));

Gizmos.DrawLine(transform.position,transform.position+newVector3(rayDistance,0,0));

}

怪物自動(dòng)移動(dòng)效果:

第六步:游戲控制器

終于到了游戲控制器這一步啦~

細(xì)心地小伙伴可能發(fā)現(xiàn)了,從開頭到現(xiàn)在大部分都是代碼

因?yàn)檫@個(gè)小游戲在引擎操作的步驟真的很少,大多數(shù)都在腳本上進(jìn)行的邏輯編寫,所以本篇文章可能有些枯燥~

如果說(shuō)上面的步驟已經(jīng)將游戲大概玩法寫完了,那這一步則是最為重要的游戲控制器的編寫這個(gè)游戲中的游戲控制器,用于控制一個(gè)游戲的進(jìn)行如果說(shuō)沒(méi)有游戲控制器,那就相當(dāng)于一個(gè)沒(méi)有游戲規(guī)則的游戲Demo有了游戲控制器才算是一個(gè)制定游戲規(guī)則的人,才能讓游戲有條不紊的進(jìn)行下去!

那就來(lái)搞一下我們這個(gè)游戲控制器吧!

我們通過(guò)游戲控制器給這個(gè)炸彈人小游戲設(shè)置關(guān)卡

還有一個(gè)關(guān)卡計(jì)數(shù)器,判斷下一關(guān)的進(jìn)行,和更新地圖和怪物!

最后還要有一個(gè)游戲結(jié)束界面,在炸彈人三條命都用完的時(shí)候觸發(fā)結(jié)束界面~

好了,大體思路就是這樣了

上GameController腳本代碼看一下:

///summary

///關(guān)卡計(jì)時(shí)器

////summary

privatevoidLevelTimer()

//時(shí)間用完了,游戲結(jié)束

if(time=0)

if(playerCtrl.HP0)

playerCtrl.HP--;//用生命換時(shí)間

time=200;

return;

playerCtrl.PlayDieAnim();

return;

timer+=Time.deltaTime;

if(timer=1.0f)

time--;

timer=0;

///summary

///游戲結(jié)束

////summary

publicvoidGameOver()

UIController.Instance.ShowGameOverPanel();//顯示游戲結(jié)束界面

privatevoidUpdate()

LevelTimer();

//UIController.Instance.Refresh(playerCtrl.HP,levelCount,time,enemyCount);

///summary

///加載下一關(guān)

////summary

publicvoidLoadNextLevel()

if(enemyCount=0)

LevelCtrl();

///summary

///關(guān)卡控制器

////summary

privatevoidLevelCtrl()

time=levelCount*50+130;

intx=6+2*(levelCount/3);

inty=3+2*(levelCount/3);//每3關(guān)增加2個(gè)

if(x18)

x=18;

if(y15)

y=15;

enemyCount=(int)(levelCount*1.5f)+1;

if(enemyCount40)

enemyCount=40;

mapController.InitMap(x,y,x*y,enemyCount);

if(player==null)

player=Instantiate(playerPre);

playerCtrl=player.GetComponentPlayerCtrl

playerCtrl.Init(1,3,2);

playerCtrl.ResetPlayer();

player.transform.position=mapController.GetPlayerPos();

//回收?qǐng)鼍爸袣埩舻谋ㄌ匦?/p>

GameObject[]effects

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論