版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《GA 557.1-2005互聯(lián)網(wǎng)上網(wǎng)服務(wù)營(yíng)業(yè)場(chǎng)所信息安全管理代碼 第1部分:營(yíng)業(yè)場(chǎng)所代碼》專題研究報(bào)告
- 中學(xué)學(xué)生社團(tuán)活動(dòng)交流合作制度
- 養(yǎng)老院消防演練制度
- 企業(yè)財(cái)務(wù)分析與預(yù)算管理制度
- 2026湖北省定向清華大學(xué)選調(diào)生招錄備考題庫(kù)附答案
- 2026福建泉州市南安市衛(wèi)生事業(yè)單位赴福建醫(yī)科大學(xué)招聘編制內(nèi)衛(wèi)生類人員64人備考題庫(kù)附答案
- 2026福建省面向華東理工大學(xué)選調(diào)生選拔工作備考題庫(kù)附答案
- 2026福建福州第十九中學(xué)招聘編外行政人員(勞務(wù)派遣)1人備考題庫(kù)附答案
- 2026重慶九洲智造科技有限公司招聘研發(fā)工程師10人備考題庫(kù)附答案
- 2026遼寧大連理工大學(xué)化工學(xué)院劉家旭團(tuán)隊(duì)科研助理招聘1人(自聘)參考題庫(kù)附答案
- 初中語(yǔ)文新課程標(biāo)準(zhǔn)與解讀課件
- 無(wú)人機(jī)裝調(diào)檢修工培訓(xùn)計(jì)劃及大綱
- 中建通風(fēng)與空調(diào)施工方案
- 高考語(yǔ)言運(yùn)用題型之長(zhǎng)短句變換 學(xué)案(含答案)
- 春よ、來(lái)い(春天來(lái)了)高木綾子演奏長(zhǎng)笛曲譜鋼琴伴奏
- ARJ21機(jī)型理論知識(shí)考試題庫(kù)(匯總版)
- 2023年婁底市建設(shè)系統(tǒng)事業(yè)單位招聘考試筆試模擬試題及答案解析
- GB/T 4623-2014環(huán)形混凝土電桿
- GB/T 32065.4-2015海洋儀器環(huán)境試驗(yàn)方法第4部分:高溫試驗(yàn)
- GB/T 16823.3-2010緊固件扭矩-夾緊力試驗(yàn)
- 中介服務(wù)費(fèi)承諾書
評(píng)論
0/150
提交評(píng)論