大家好,这里是暴躁老哥酒九。最近了我们的童年记忆《摩尔庄园》在手机上面复活了,不知道大家有没有沉迷于种菜无法自拔呢(反正我是累了)。
种田才是这个游戏本质吧~
在《摩尔庄园》中了为我们玩家提供了很多的玩法比如:钓鱼,烹饪,开餐厅,庄园和玩家自身装扮,职业选择和种田(小声逼逼:虽然我都觉得挺鸡肋的)。但是并不妨碍我们发挥身为的中国人的特长——种田!大家在现实中打完一天工以后,回到家还要坚持在游戏中种田,浇水。你给我翻译翻译什么叫做热爱!
所以今天我们就来试着用Unity做一款种田小游戏。
好啦,进入正片,我们首先想一想我们做的是一个种田的游戏,那么我们种田的流程是怎样的呢?首先玩家需要开垦一块土地,然后在我们的背包栏中选择到对应的种子,再在被开垦好的土地上进行播种,然后就是等待种子生长好了以后收获果实啦,卖出获得金钱,再去商店买种子。
相信大家已经发现了,我们实现这个流程并不困难,但是了这个游戏中的真正的重点是游戏中各项信息本地存储。本片文章了我将为大家介绍一下我个人使用最多的三种Unity中信息存储方式,不过在这里我先按下不表。我们先一步一步的来制作我们的种田小游戏。
首先找到需要的场景素材,无论你是在Unity的官方商城还是万能的某宝上购买都可以,将场景素材下载好了以后,打开Unity新创建一个工程取好工程名设置好工程的文件的保存路径,打开工程将下载好的素材包拖入工程中。搭建一个自己的场景,选择好人物模型,大家可以用自己的方法来控制人物的移动,这里我就不过多嘴了。
但是,想要到达上图的效果我还缺少了一步——摄像机的跟随。所以新建一个脚本命名为CameraFollow,在这个脚本中编写摄像机跟随的脚本。
public class CameraFollow : MonoBehaviour
{
public Transform player;//玩家角色的位置``
public float moveSpeed;//移动的速度
public float turnSpeed;//转向的速度
Vector3 offset;//摄像机和玩家角色之间的向量
RaycastHit rh;//射线打的物体
float dis;//摄像机和玩家角色之间的距离
Vector3[] currentPoints;//玩家被遮挡以后摄像机可以移动的点位数组
void Awake()
{
moveSpeed = 3f;
turnSpeed = 10f;
currentPoints = new Vector3[5];
}
void Start()
{
dis = Vector3.Distance(transform.position, player.position);
offset = player.position - transform.position;
}
void LateUpdate()//放在LateUpdate中在玩家移动后再执行
{
//在一条曲线上面分布好点位
Vector3 startPos = player.position - offset;
Vector3 endPos = player.position + Vector3.up * dis;
currentPoints[0] = startPos;
currentPoints[1] = Vector3.Slerp(startPos, endPos, 0.25f);
currentPoints[2] = Vector3.Slerp(startPos, endPos, 0.5f);
currentPoints[3] = Vector3.Slerp(startPos, endPos, 0.75f);
currentPoints[4] = endPos;
Vector3 view = currentPoints[0];
for (int i = 0; i < currentPoints.Length; i++)
{
if (CheckPlayer(currentPoints[i]))
{
view = currentPoints[i];
break;
}
}
transform.position = Vector3.Lerp(transform.position, view, Time.deltaTime * moveSpeed);
Rotate();
}
public bool CheckPlayer(Vector3 pos) //从摄像机朝玩家方向打一条射线判断玩家是否被挡住
{
Vector3 dir = player.position - pos;
if (Physics.Raycast(pos, dir, out rh))
{
if (rh.collider.CompareTag("Player"))//通过玩家的Tag来判断
{
return true;
}
}
return false;
}
public void Rotate()//摄像机的旋转
{
Vector3 Dir = player.position - transform.position;
Quaternion qua = Quaternion.LookRotation(Dir);
transform.rotation = Quaternion.Lerp(transform.rotation, qua, Time.deltaTime * turnSpeed);
transform.eulerAngles = new Vector3(transform.eulerAngles.x, 0, 0);
}
}
将编写好的CameraFollow脚本拖到场景中的MainCamera上去再把人物拖到CameraFollow下的player中去。然后再场景中去调整摄像机和玩家的位置选择一个合适的距离和角度。再运行游戏就可以看到上图的那种效果了。而且再玩家角色被物体遮挡时(当前的遮挡物又碰撞体)摄像头会自动调整位置看向玩家。这里我就不放图演示了。
好了接下来就是就是重点了(敲黑板),在这个游戏中玩家能种植不同的种子,不同的种子拥有不同的名字,持有数量,描述,成长时间,在场景中显示的模型,在UI界面显示的图片。那么怎么来实现不同的种子具有这些信息了,通过创建包含这些信息不同的预制体?可以。且先不说一款通常的种田游戏中的道具种类和数量都是很多的,如果当游戏需要调整时,制作者就需要一个一个到预制体中去进行修改。这样的方式太麻烦也太笨拙了。那怎么办了。这里就要将上文中按下不表的部分给”表“出来了。这三种信息存储方式分别是:ScriptableObject,TextAsset,Json。接下来我会根据游戏开发的推进来一个一个的为大家介绍使用。
首先是将游戏中的物品的信息进行分类,通常来说一个物品的名字,描述,价格,(种子)成长时间是一开始就设计好了且在游戏游玩中也不会去更改,再来看物品再场景中的模型和在UI界面上显示的图片也可以通过对于模型或图片在工程中的存放路径来读取。而一个物品的玩家持有的数量是会随着玩家消耗或购买增减。这样一对比就把物品的信息分成了两类——在游戏游玩过程中会变的和不会变的。这样说是不是有点太土了?那就是静态数据和动态数据了。这里我选择将物品的静态数据使用表格获取,读取方法就是通过TextAsset了。动态数据就是用我们的Json文件格式来进行读取和存储了。
PS:这里为了方便物品的主要演示的是种子类了(其实就是没有找到合适的素材)。文章来源:https://www.toymoban.com/news/detail-433676.html
CSV中的静态数据读取
这里先新建一个Seeds脚本,在里面声明一个Seeds类(种子类)文章来源地址https://www.toymoban.com/news/detail-433676.html
public class Seeds
{
//动态数据
public int ID;//种子的ID方便找到对于的种子数据
public int count;//种子的数量
//静态数据
public string name;//种子的名字
public string description;//种子的描述
public
到了这里,关于从零开始的种田生活-Unity游戏开发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!