项目简介
一个Unity3D开发的角色扮演游戏,适合初学者参考学习,也可以用来做毕业设计,解压即可使用。
资源链接
演示视频: https://b23.tv/oqvhQGZ
资源介绍
游戏场景 2种
人物模型 6种
怪物模型 4种
武器模型 20种
粒子特效 50+
装备、道具图标 56+
UI素材若干
攻击、走路、死亡等动画若干
游戏大小
1.23g(压缩包628m)
游戏功能设计
游戏分为10部分,分别是游戏界面设计、游戏地图设计、角色设计、怪物系统、游戏道具设计、背包系统、商店系统、战斗系统、任务系统、存储系统。
游戏界面设计
游戏界面

主菜单

角色创建界面

游戏界面

商店界面

任务界面

角色属性界面

背包界面
部分代码展示
怪物有限状态机实现
void StateUpdate()
{
//如果目标存在且非死亡状态,切换攻击状态
if (target && state != MonsterState.Death)
{
state = MonsterState.Attack;
}
switch (state)
{
//空闲状态
case MonsterState.Idle:
if (anim.isPlaying == false)
{
int num = Random.Range(0, 10);
switch (num)
{
case 0:
case 1:
case 2:
case 3:
case 4:
anim.CrossFade("idle");
break;
case 5:
case 6:
anim.CrossFade("idle_lookaround");
break;
case 7:
case 8:
anim.CrossFade("roar");
break;
case 9:
state = MonsterState.Walk;
break;
}
}
break;
//行走状态
case MonsterState.Walk:
//如果没有播放行走动画
if (anim.IsPlaying("walk") == false)
{
int i = Random.Range(0, monsterManager.nextPos.Length);
nextPos = monsterManager.nextPos[i].position;
transform.LookAt(new Vector3(nextPos.x, transform.position.y, nextPos.z));
}
anim.CrossFade("walk");
//如果正在播放行走动画
if (anim.IsPlaying("walk") == true)
{
controller.SimpleMove(transform.forward * walkSpeed);
DistanceUpdate(nextPos);
if (distance < 0.5f)
{
anim.Stop();
state = MonsterState.Idle;
}
}
break;
//追逐状态
case MonsterState.Run:
break;
//攻击状态
case MonsterState.Attack:
if (target)
{
Attack();
}
else
{
state = MonsterState.Idle;
}
break;
//死亡状态
case MonsterState.Death:
break;
}
}
物品逻辑
public virtual void OnEndDrag(PointerEventData eventData)
{
if (currentGrid.name == "Destroy")
{
Destroy(gameObject);
}
//如果格子有2个以上物品
if (transform.parent.transform.childCount > 1)
{
GameObject itemEx = transform.parent.transform.GetChild(0).gameObject;
//如果是装备
if (itemEx.tag == Tags.Equipment)
{
itemEx.GetComponent<Equipment>().transform.SetParent(itemEx.GetComponent<Equipment>().currentGrid);
}
//如果是药水
else if (itemEx.tag == Tags.Potion)
{
itemEx.GetComponent<Potion>().transform.SetParent(itemEx.GetComponent<Potion>().currentGrid);
}
//如果是材料
else if (itemEx.tag == Tags.Material)
{
itemEx.GetComponent<ItemMaterial>().transform.SetParent(itemEx.GetComponent<ItemMaterial>().currentGrid);
}
itemEx.transform.localPosition = Vector3.zero;
}
ObjectsDialog.instance.ShowDlg(transform.position);
}