unity商店demo学习:俯视视角RPG游戏
来源:互联网 发布:win7无法网络打印 编辑:程序博客网 时间:2024/04/28 11:34
一下所有素材和源码都来自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 heropublic GameObject buttonNext,buttonPrev; //button prev and button next[HideInInspector]public int indexHero = 0; //index select heroprivate GameObject[] heroInstance; //use to keep hero gameobject when Instantiate// Use this for initializationvoid Start () {heroInstance = new GameObject[hero.Length]; //add array size equal hero sizeindexHero = 0; //set default selected heroSpawnHero(); //spawn hero to display current selected//check if hero is less than 1 , button next and prev will disappearif(hero.Length <= 1){buttonNext.SetActive(false);buttonPrev.SetActive(false);}}//Check show only selected characterpublic void UpdateHero(int _indexHero){for(int i=0; i<hero.Length;i++){//Show only select characterif(i == _indexHero){heroInstance[i].SetActive(true);}else{//Hide Other CharacterheroInstance[i].SetActive(false);}}}//Spawn all heropublic 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 destinationif(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
主要是游戏抬头界面,包括角色血条、魔条和经验条,技能快捷键栏还有系统菜单
控制脚本
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看着真是赏心悦目啊,可惜看得不是太懂,暂时没有能力模仿,只能慢慢来~
0 0
- unity商店demo学习:俯视视角RPG游戏
- unity商店demo学习:跑酷游戏
- unity商店demo学习:跑酷游戏
- RPG游戏商店系统
- RPG游戏人物视角控制,相机跟随
- unreal engine4官网demo学习:第三人称视角游戏
- Unity学习笔记--鹰击长空类固定视角游戏摄像机跟随
- 向左还是向右?Unity中俯视视角下人物智能转向的控制方法
- Unity RPG游戏 资源地址
- 摄像机之RPG游戏中玩家第三视角
- 非俯视视角时的点击判断
- Flex RPG游戏DEMO (2):夭折篇
- Unity开发—简单的RPG游戏
- Unity学习笔记1 简易2D横版RPG游戏制作(一)
- Unity学习笔记2 简易2D横版RPG游戏制作(二)
- Unity学习笔记3 简易2D横版RPG游戏制作(三)
- 【unity学习笔记】手机RPG游戏中角色移动方式实现
- unity官方demo学习之Stealth(五)游戏控制器
- mysql 导入导出摘要
- 标记
- linux 命令整理
- sql 基础 ( 数据的增删改查 )
- Polymer
- unity商店demo学习:俯视视角RPG游戏
- AutoLayout
- iOS socket
- C山寨C++
- Java项目切换maven编译时出现大量重复jar包
- C/C++ void func() const
- YT02-简单数学课后题-1004 The Last Practice -(5.31日-烟台大学ACM预备队解题报告)
- 常见sql for oracle
- Android Fragment 真正的完全解析(下)