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

一下所有素材和源码都来自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看着真是赏心悦目啊,可惜看得不是太懂,暂时没有能力模仿,只能慢慢来~

时间: 2024-08-23 02:30:00

unity商店demo学习:俯视视角RPG游戏的相关文章

unity商店demo学习:跑酷游戏

本文素材和代码全部来自unity asset store里面的3D Infinite Runner Toolkit项目 步骤 场景一:TitleScene 1 搭建开始界面场景 这个场景是开启游戏的第一个界面,用于选择切换到正式游戏场景或者商店. 只需要拖入主场景模型和一个角色模型即可,并添加UI资源. 2 添加角色动画逻辑和场景切换逻辑脚本 将要切换的脚本设置为一个变量名,然后切换场景的脚本就可以在不同button间复用 <span style="white-space:pre"

unity日本漫画风冷兵器动作RPG游戏《武士2复仇》源码

<武士>一代曾获得APPLE年度最佳游戏的奖项,因其极具漫画风格的画面和干净利落.充满血腥的游戏广受玩家好评.二代在一代的基础上剧情.操作感.画面以及设备支持上面都有了很大的提高,众多评测媒体都给出了90以上甚至满分的评价.游戏中的剧情取材于动漫岛田大辅如何复仇藤香之死,配以震撼的原声音乐呼唤起玩家血雨腥风的杀戮快感,横扫一切的战斗渴望. <武士2:复仇>将延续上一作的战斗风格,游戏的血.腥度依然很高.不过这也保持了游戏战斗的刺激与爽快感.同时相比前作<武士2:复仇>的

使用HTML5制作简单的RPG游戏

很久以前就想着做一个游戏,但什么都不会又不知道从哪里开始,胡乱找来一些书籍和资料结果太深奥看不懂,无奈只能放弃.这一弃就是十多年,倥偬半生,眼看垂垂老矣,还是没能有什么成果. 近年来游戏引擎越来越多,相关资料也愈加丰富,使得游戏开发的门槛不再那么高了.特别是HTML5游戏,只需要一个支持HTML5的浏览器就能运行,特别适合我这样的初学者.一个偶然的机会,在某著名视频网站上发现很多关于Enchant.js 这个游戏引擎的教学视频,还有一本教程叫做<HTML5 Game Programming wi

Unity3D RPG游戏制作 随堂笔记(2)

大家好,我是冰糖咖啡,来自山东的一名大三的Unity3D学习者,最近在通过泰课在线学习<Unity3D RPG游戏开发>,写下一些学到的东西: Water(Basic) 为场景中的河流添加水面,这里需要提醒一下,在Unity3D 5.0版本以前可以直接在菜单栏中找到Asset,单击它asset,再单击import package ,最后单击water(basic).弹出对话框,直接单击import,导入资源包. 而在Unity3D 5.x版本中,将水资源包挪到Environment中,所以需要

【Unity 3D】学习笔记二十九:游戏实例——简单小地图制作

任何的学习,光看不练是学不好的.所以这次就总结回顾下怎么制作MMROPG类游戏中的小地图.在MMROPG类游戏里,主角在游戏世界里走动时,一般在屏幕右上角都会有一个区域来显示当前游戏场景的小地图.主角在游戏世界里走动,小地图里代表着主角的小标记也会随之移动.那怎么实现咧? 首先需要确定两个贴图,第一个是右上角的小地图背景贴图,应该是从Y轴俯视向下截取主角所在的位置大地图.第二个就是主角的位置大贴图.在本例中,因为没有学习unity地图制作,所以地图用一个面对象代替,主角用立方体代替,使用GUI来

【Unity 3D】学习笔记三十五:游戏实例——摄像机切换镜头

摄像机切换镜头 在游戏中常常会切换摄像机来观察某一个游戏对象,能够说.在3D游戏开发中,摄像头的切换是不可或缺的. 这次我们学习总结下摄像机怎么切换镜头. 代码: private var Camera0: GameObject; private var Camera1: GameObject; private var Camera2: GameObject; private var Camera: GameObject; function Start() { //获取摄像机对象 Camera =

【Unity 3D】学习笔记三十四:游戏元素——常用编辑器组件

常用编辑器组件 unity的特色之一就是编辑器可视化,很多常用的功能都可以在编辑器中完成.常用的编辑器可分为两种:原有组件和拓展组件.原有组件是编辑器原生的一些功能,拓展组件是编辑器智商通过脚本拓展的新功能. 摄像机 摄像机是unity最为核心组件之一,游戏界面中显示的一切内容都得需要摄像机来照射才能显示.摄像机组件的参数如下: clear flags:背景显示内容,默认的是skybox.前提是必须在render settings 中设置天空盒子材质. background:背景显示颜色,如果没

【Unity 3D】学习笔记二十六:unity游戏脚本(六)

在3D游戏世界中,任何一个游戏对象在创建的时候都会附带Transform(变换)组件,并且该组件是无法删除的,也不应该删除.在unity中,Transform面板一共有3个属性: Position  (位置) Rotation(旋转) Scale(缩放) 这三个值都是用来调整游戏对象在游戏界面中的位置,状态等相关参数. Position  (位置) 任何一个游戏对象的三维坐标都保存在Vector3容器中,该容器记录对象在X轴,Y轴,Z轴的坐标.一旦Vector33容器中的坐标发生变化,那么Sce

【Unity 3D】学习笔记三十三:游戏元素——天空盒子

天空盒子 一般的3D游戏都会有着北京百年一遇的蓝天,让人惊叹不已.其实天空这个效果没有什么神秘的只需用到天空盒子这个组件就行,可以将天空设想成一个巨大的盒子,这个盒子将整个游戏视图和所有的游戏元素包含其中.在unity中制作天空盒子非常方便,只需要像设置其他组件一样设置下就行了.在制作天空盒子之前,我们需要搜集一些天空的贴图,不过,unity很方便的为开发者提供了天空盒子的资源包.首先在project视图中点击鼠标右键,然后选择import package--skyboxes即可添加天空盒子的资