首页 > 编程语言 > 详细

unity商店demo学习:俯视视角RPG游戏

时间:2015-06-01 20:28:35      阅读:566      评论:0      收藏:0      [点我收藏+]

一下所有素材和源码都来自unity商店的实例 Top-Down RPG Starter Kit ,这个demo是unity商店上最好的入门级rpg游戏实例,麻雀虽小,五脏俱全,想要弄清楚一个标准的rpg游戏的方方面面,这个是很好的选择。

ps:demo写得很高深,看得不是很懂,准备慢慢研究。

来一张工程全貌图。

技术分享


这是一个俯视视角(可以调整视角)的卡通风格3D角色扮演游戏,配着动听又欢快的背景音乐,还有那萌萌哒的怪物,仿佛又回到了初中时玩冒险岛online的时候~~,额,不废话,主要模块如下:

  • 游戏主菜单界面
  • 游戏角色选择场景
  • 游戏角色控制
  • 摄像机控制
  • 角色成长系统
  • NPC对话和任务系统
  • 技能系统
  • 背包系统
  • 装备系统
  • 商店系统
  • 小地图
  • 游戏怪物AI
  • 怪物掉落和拾取
  • 怪物boss
  • 游戏HUD GUI
  • 音乐和音效
  • 存档系统
缺少地图系统、骑宠系统副本系统
以下就逐个来体验吧。

游戏主菜单界面

技术分享
加载了基本游戏场景、灯光、天空盒以及主菜单界面GUI
主要由四个脚本控制
技术分享
ControlTitleScene控制摄像机移动和文字效果
AlphaText控制开始时画面由模糊到清晰
NewGameButton开始新游戏
LoadGameButton加载存档

其中两个button是用GUITexture控件实现的,并非ugui或者legacy ui
<span style="white-space:pre">	</span>void OnMouseUp()
	{
		this.guiTexture.texture = buttonNormal;
		Invoke("LoadScene",0.1f);
	}
	
	void OnMouseDown()
	{
		if(buttonSfx != null)
			AudioSource.PlayClipAtPoint(buttonSfx,transform.position);
		
		this.guiTexture.texture = buttonDown;
	}
		
	void LoadScene()
	{
		Application.LoadLevel(loadSceneName);;	
	}

游戏角色选择场景

技术分享

技术分享
依然是加载了基本游戏场景、灯光、天空盒以及主菜单界面GUI,还有游戏角色。
这个场景可以创建自己的角色,有剑士和法师两个角色可选。
由四个脚本控制
技术分享
ButtonOK确定角色选取
ButtonSelected用于切换角色按钮
Etenname获取用户的字符输入
SelectCharacter用于呈现选取的角色,隐藏未选取的角色,动态实例化的坐标点在场景中庸空物体标出

其中动态实例化角色是一个关键点
public class SelectCharacter : MonoBehaviour {
	
	public GameObject[] hero;  //your hero
	public GameObject buttonNext,buttonPrev; //button prev and button next

	[HideInInspector]
	public int indexHero = 0;  //index select hero
	
	private GameObject[] heroInstance; //use to keep hero gameobject when Instantiate
	
	// Use this for initialization
	void Start () {
		
		heroInstance = new GameObject[hero.Length]; //add array size equal hero size
		indexHero = 0; //set default selected hero
		SpawnHero(); //spawn hero to display current selected
		
		
		//check if hero is less than 1 , button next and prev will disappear
		if(hero.Length <= 1)
		{
			buttonNext.SetActive(false);
			buttonPrev.SetActive(false);
		}
		
	
	}
	
	//Check show only selected character
	public void UpdateHero(int _indexHero)
	{
		for(int i=0; i<hero.Length;i++)
		{
			//Show only select character
			if(i == _indexHero)
			{
				heroInstance[i].SetActive(true);
			}else
			{
				//Hide Other Character
				heroInstance[i].SetActive(false);
			}		
		}
	}
	
	//Spawn all hero
	public void SpawnHero()
	{
		for(int i=0;i<hero.Length;i++)
		{
			heroInstance[i] = (GameObject)Instantiate(hero[i],transform.position,transform.rotation);
		}
		
		UpdateHero(indexHero);
	}
	
}

游戏角色控制

技术分享

技术分享
依然是加载了基本游戏场景、灯光、天空盒以及主菜单界面GUI,还有游戏角色、若干NPC以及怪物。
角色控制有下列脚本,但此处只说游戏行走、技能控制
技术分享
HeroController控制角色行走和发招
SpawnPointHero角色出生点和重新出生
AreaSkillCursor控制群攻技能操作范围
SkillArea计算群攻范围和目标数
AnimationManager控制角色行走和攻击动画

==代码没看懂T_T

摄像机控制

技术分享

技术分享
摄像机视角可以调成俯视和普通近距离3D模式,并且摄像机跟随离角色的距离也可以自由调整
主要控制脚本
技术分享
MinimapCamera控制摄像机目标跟随和迷你小地图坐标定位
MouseOrbit控制视角旋转和缩放

其中旋转用到了四元数,很基本的图形学
Quaternion rotation = Quaternion.Euler(y, x, 0);			
Vector3 calPos = new Vector3(0, 0, -distanceLerp);
position = rotation * calPos + target.transform.position;
transform.rotation = rotation;

角色成长系统

技术分享
角色的HP,MP以及经验值管理和升级,属性加点
由PlayerStatus脚本管理

==代码依然没看懂T_T

NPC对话和任务系统

技术分享
与NPC对话并接任务
技术分享
NpcSetup控制NPC的生成和都对话框的交互

比如检测任务是否完成和给予奖励
	bool CheckConditionItem(int id,int amout)
	{
		for(int i =0;i<inventory.bag_item.Count;i++)
		{
			if(inventory.bag_item[i].item_id == id && inventory.bag_item[i].item_amount >= amout)
			{
				inventory.bag_item[i].item_amount -= amout;
				
				if(inventory.bag_item[i].item_amount <= 0)
				{
					inventory.bag_item[i].item_id = 0;	
				}
				
				return true;
			}
		}
		
		return false;
	}
	
	void GiveReward(int id)
	{
		for(int i=0;i<questData.questSetting.Count;i++)
		{
			if(questID == questData.questSetting[i].questID)
			{
				inventory.GiveItem((int)questData.questSetting[i].itemIDReward.x,(int)questData.questSetting[i].itemIDReward.y);
				Debug.Log("Give");
				break;	
			}
		}
	}

技能系统

技术分享
技能系统包括技能的激活、学习、加点、属性加成、技能快捷键

由PlayerSkill脚本控制

==代码依然没看懂T_T

背包系统

技术分享
管理背包物品,可以物品可拖拽到装备窗口和技能快捷窗口

装备系统

技术分享
由脚本Item_Data控制
public enum Equipment_Type{
		Null = 0, Head_Gear = 1, Armor = 2, Shoes = 3, Accessory = 4, Left_Hand = 5, Right_Hand = 6, Two_Hand = 7 	
	}

商店系统

技术分享
有药品商店和装备商店两种
脚本Item_data,Item_obj,ShopItemlist脚本控制,一个公共类实现两个商店的实例

例如购买商品
	public Item Get_Item(int item_id){
		int i = 0;
		bool isEnd = false;
		if(isEnd == false){
			while(i < item_equipment_set.Count){
				if(item_id == item_equipment_set[i].item_ID){
					return item_equipment_set[i];
					i = item_equipment_set.Count;
					isEnd = true;
				}
				i++;
			}
		}
		i = 0;
		if(isEnd == false){
			while(i < item_usable_set.Count){
				if(item_id == item_usable_set[i].item_ID){
					return item_usable_set[i];
					i = item_usable_set.Count;
					isEnd = true;
				}
				i++;
			}
		}
		i = 0;
		if(isEnd == false){
			while(i < item_etc_set.Count){
				if(item_id == item_etc_set[i].item_ID){
					return item_etc_set[i];
					i = item_etc_set.Count;
					isEnd = true;
				}
				i++;
			}
		}
		i = 0;
		if(isEnd == false){
			while(i < item_gold.Length){
				if(item_id == item_gold[i].item_ID){
					return item_gold[i];
					i = item_gold.Length;
					isEnd = true;
				}
				i++;
			}
		}
		
		
		return null;
	}

小地图

技术分享
小地图用于位置概览和自动导航,可以缩放
由脚本MinimapSignSetup和MinimapCamera来控制

其中设置商店、角色和怪物的标记点
	void TextureSetup ()
	{
		if(signType == MinimapSignType.Player)
		{
			this.gameObject.renderer.material = MinimapSign.Instance.minimapSignMat[0];	
		}else if(signType == MinimapSignType.Enemy)
		{
			this.gameObject.renderer.material = MinimapSign.Instance.minimapSignMat[1];	
		}else if(signType == MinimapSignType.Boss)
		{
			this.gameObject.renderer.material = MinimapSign.Instance.minimapSignMat[2];	
		}else if(signType == MinimapSignType.Npc)
		{
			this.gameObject.renderer.material = MinimapSign.Instance.minimapSignMat[3];	
		}else if(signType == MinimapSignType.ShopWeapon)
		{
			this.gameObject.renderer.material = MinimapSign.Instance.minimapSignMat[4];	
		}else if(signType == MinimapSignType.ShopPotion)
		{
			this.gameObject.renderer.material = MinimapSign.Instance.minimapSignMat[5];	
		}else if(signType == MinimapSignType.SavePoint)
		{
			this.gameObject.renderer.material = MinimapSign.Instance.minimapSignMat[6];	
		}else if(signType == MinimapSignType.Quest)
		{
			this.gameObject.renderer.material = MinimapSign.Instance.minimapSignMat[7];	
		}
			
	}

游戏怪物AI

技术分享
怪物AI包括怪物跟踪,攻击等行为
控制脚本
技术分享
DetectArea检测与角色的碰撞
DropItem控制怪物掉落
EnemyController控制怪物行走和攻击
EnemyStatus控制怪物血条状态
Monster_Data管理怪物数据

怪物跟踪只是简单的使用了直线移动
		// Move to destination
		if(ctrlAnimState == ControlAnimationState.Move){
			
			if(controller.isGrounded){
				movedir = Vector3.zero;
				movedir = transform.TransformDirection(Vector3.forward*moveSpeed);
			}
			
		}else
		{
			movedir = Vector3.Lerp(movedir,Vector3.zero,Time.deltaTime * 10);
		}
		movedir.y -= 20 * Time.deltaTime;
		controller.Move(movedir*Time.deltaTime);

怪物掉落和拾取

技术分享
怪物掉落
	public void UseDropItem(){
		
		
		for(int i = 0; i < item_Drop_List.Count; i++){
			float percentResult = Random.Range(0,100);
			if(percentResult < item_Drop_List[i].percentDrop){
				GameObject go = (GameObject)Instantiate(item_Obj_Pref,transform.position+(Vector3.up),Quaternion.identity);
				go.rigidbody.AddForce(new Vector3(Random.Range(-1,1)*1.5f*powerImpulse,1*3*powerImpulse,Random.Range(-1,1)*1.5f*powerImpulse),ForceMode.Impulse);
				Item_Obj item_obj = go.GetComponent<Item_Obj>();
				item_obj.item_id = item_Drop_List[i].item_id;
				item_obj.SetItem();
				if(item_obj.gold){
					item_obj.gold_price = Random.Range(gold_min, gold_max);
				}	
			}
		}
	}

怪物boss

技术分享
boss其实跟普通怪物差不多,只不过数值要高不少

游戏HUD GUI

技术分享
主要是游戏抬头界面,包括角色血条、魔条和经验条,技能快捷键栏还有系统菜单
控制脚本
技术分享
BottomBar绘制技能快捷栏
CommanMenu绘制系统命令栏,背包,技能,装备,状态等
EnemyHP绘制敌人的血条
HeroStatusBar绘制角色HP,MP和头像

没有使用NGUI或者UGUI,全部是legacy gui
GUI.BeginGroup(new Rect(posHPbar.x, posHPbar.y,sizeHPBar.x,sizeHPBar.y));
	       GUI.DrawTexture(new Rect(0,0, sizeHPBar.x ,sizeHPBar.y), hpBar);
			
		        GUI.BeginGroup(new Rect(0,0,ConvertHP(sizeHPBar.x,maxHP,curHP),sizeHPBar.y));
				
		         GUI.DrawTexture(new Rect(0,0,sizeHPBar.x,sizeHPBar.y), hpCurrent);
		         GUI.EndGroup();
			
	       GUI.EndGroup();

音乐和音效

技术分享
音乐和音效统一管理
由SoundManager脚本统一控制
	public void PlayingSound(string _soundName){
		AudioSource.PlayClipAtPoint(sound_List[FindSound(_soundName)].audioClip, Camera.mainCamera.transform.position);
	}
	
	private int FindSound(string _soundName){
		int i = 0;
		while( i < sound_List.Count ){
			if(sound_List[i].soundName == _soundName){
				return i;	
			}
			i++;
		}
		return i;
	}

存档系统

技术分享
游戏可以到指定地点存档,然后在游戏开始时可以读档

不过脚本貌似没找到,不知道用什么存储档案T_T

ps:demo看着真是赏心悦目啊,可惜看得不是太懂,暂时没有能力模仿,只能慢慢来~

unity商店demo学习:俯视视角RPG游戏

原文:http://blog.csdn.net/u012234115/article/details/46311237

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!