unity商店demo学习:俯视视角RPG游戏
2015-06-01 20:13
716 查看
一下所有素材和源码都来自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
依然是加载了基本游戏场景、灯光、天空盒以及主菜单界面GUI,还有游戏角色。
这个场景可以创建自己的角色,有剑士和法师两个角色可选。
由四个脚本控制
ButtonOK确定角色选取
ButtonSelected用于切换角色按钮
Etenname获取用户的字符输入
SelectCharacter用于呈现选取的角色,隐藏未选取的角色,动态实例化的坐标点在场景中庸空物体标出
其中动态实例化角色是一个关键点
依然是加载了基本游戏场景、灯光、天空盒以及主菜单界面GUI,还有游戏角色、若干NPC以及怪物。
角色控制有下列脚本,但此处只说游戏行走、技能控制
HeroController控制角色行走和发招
SpawnPointHero角色出生点和重新出生
AreaSkillCursor控制群攻技能操作范围
SkillArea计算群攻范围和目标数
AnimationManager控制角色行走和攻击动画
==代码没看懂T_T
摄像机视角可以调成俯视和普通近距离3D模式,并且摄像机跟随离角色的距离也可以自由调整
主要控制脚本
MinimapCamera控制摄像机目标跟随和迷你小地图坐标定位
MouseOrbit控制视角旋转和缩放
其中旋转用到了四元数,很基本的图形学
角色的HP,MP以及经验值管理和升级,属性加点
由PlayerStatus脚本管理
==代码依然没看懂T_T
与NPC对话并接任务
NpcSetup控制NPC的生成和都对话框的交互
比如检测任务是否完成和给予奖励
技能系统包括技能的激活、学习、加点、属性加成、技能快捷键
由PlayerSkill脚本控制
==代码依然没看懂T_T
管理背包物品,可以物品可拖拽到装备窗口和技能快捷窗口
由脚本Item_Data控制
有药品商店和装备商店两种
脚本Item_data,Item_obj,ShopItemlist脚本控制,一个公共类实现两个商店的实例
例如购买商品
小地图用于位置概览和自动导航,可以缩放
由脚本MinimapSignSetup和MinimapCamera来控制
其中设置商店、角色和怪物的标记点
怪物AI包括怪物跟踪,攻击等行为
控制脚本
DetectArea检测与角色的碰撞
DropItem控制怪物掉落
EnemyController控制怪物行走和攻击
EnemyStatus控制怪物血条状态
Monster_Data管理怪物数据
怪物跟踪只是简单的使用了直线移动
怪物掉落
boss其实跟普通怪物差不多,只不过数值要高不少
主要是游戏抬头界面,包括角色血条、魔条和经验条,技能快捷键栏还有系统菜单
控制脚本
BottomBar绘制技能快捷栏
CommanMenu绘制系统命令栏,背包,技能,装备,状态等
EnemyHP绘制敌人的血条
HeroStatusBar绘制角色HP,MP和头像
没有使用NGUI或者UGUI,全部是legacy gui
音乐和音效统一管理
由SoundManager脚本统一控制
游戏可以到指定地点存档,然后在游戏开始时可以读档
不过脚本貌似没找到,不知道用什么存储档案T_T
ps:demo看着真是赏心悦目啊,可惜看得不是太懂,暂时没有能力模仿,只能慢慢来~
,这个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看着真是赏心悦目啊,可惜看得不是太懂,暂时没有能力模仿,只能慢慢来~
相关文章推荐
- Unity3D教程宝典之Shader篇 基本知识
- Unity3D - 图形性能优化
- Unity3d 获取屏幕depth与normal
- unity 角色死亡界面变灰实现
- unity的相关技巧
- Unity3D制作2D精灵动画
- Unity协程(Coroutine)原理深入剖析
- Unity3D开发之Unity5版本自写Shader没有雾的效果问题
- Unity java C 互调
- unity插件
- unity 全屏乱影 BlitMultiTap
- Unity3d Asset Serialization 设置错误导致SVN文件不能同步
- Unity Shader Billboard
- unity3d 批量修改Texture属性 两种方式加载贴图
- 【猫猫的Unity Shader之旅】之双面材质和多Pass渲染
- [Unity3D]UI方案及制作细节(NGUI/EZGUI/原生UI系统)
- 关于unity的一个不错的插件平台
- 【边玩边学Unity3d】实现可编辑网格
- 【边玩边学Unity3d】Mesh属性
- [UnityUI]不规则图片的点击响应