做教程远比自己开发游戏要花时间...继续写小恐龙的游戏教程
环境搭建在这里
从零开始入门创作游戏——Unity3d的环境搭建_默哀d的博客-CSDN博客
素材导入和基本页面介绍在这里
从零开始入门创作游戏——Unity编辑器的使用_默哀d的博客-CSDN博客
接下来是编辑游戏对象的运动和交互逻辑脚本
-
小恐龙的运动脚本
为了让小恐龙能根据按键进行运动,我们需要编写脚本来进行控制
在资产窗口中右键【新建】——【C#脚本】
注意:这里有几个坑
一、脚本会默认生成一部分的代码,而其中最重要的是第一个类名是与生成的脚本文件名一致的,如果后面改了脚本名字,这里也要记得改一下。
public class DinosaurSctrip : MonoBehaviour
二、如果代码没有自动补全的话,就是没有配置对应的解决方案(大概就是VS用来分析代码构成的东西),参考这个文档来安装
unity 打开vs没有解决方案_Unity使用VS Code编写C#代码没有代码补全怎么解决?_weixin_43514201的博客-CSDN博客_unity用vs写代码不会自动补全
接下来就是正式写代码了,我不会C#所以可能用词不太对,意思意思就好
首先是引用需要用到的类,加在void Start() 之前,其他的代码解释我都写在注释里了。
public class DinosaurScript : MonoBehaviour
{
Rigidbody2D rb;//控制物体下落的组件
public float jumpHeight;//创建公共变量 跳的高度
// Start is called before the first frame update
void Start()//游戏启动时进行的配置
{
rb = GetComponent<Rigidbody2D>();//获取该组件
}
// Update is called once per frame
void Update()//游戏其中每一帧进行的判断
{
if (Input.GetKeyDown(KeyCode.Space))//如果空格键按下一次时
{
rb.velocity = new Vector2(0, jumpHeight);//给这个物体一个新的速度(x轴,y轴)
}
}
}
保存后,回到unity 3d的页面,将脚本拖动到恐龙这个游戏对象中,右侧就会出现脚本配置,同时公共变量 jumpHeight 可以在这里随时修改,方便调整
可以在游戏运行的时候随时调整这两个参数,以获得自己最满意的参数
注意:这里又有一个坑,在游戏试运行的时候,调整完的参数并不会保存,一旦停止就会恢复原本的参数,所以调完自己记一下,停止运行后再修改和保存一次。
当然,这里有个明显的BUG,那就是连续按空格,小恐龙就会不停往上跳,所以需要添加一个参数限制连续跳动,然后在遇到地面后才能再次跳起。
完善后的代码如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DinosaurScript : MonoBehaviour
{
Rigidbody2D rb;//控制物体下落的组件
public float jumpHeight;//跳的高度
bool isJumping;//判断是否正在跳
// Start is called before the first frame update
void Start()
{
rb = GetComponent<Rigidbody2D>();
isJumping = false;//游戏开始时默认参数
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.Space)&& isJumping == false)//只有满足按下空格同时能跳时才能跳起
{
rb.velocity = new Vector2(0, jumpHeight);
isJumping = true;//一旦跳起了就变成不能跳了
}
}
private void OnCollisionEnter2D(Collision2D collision)//Unity中判断任何碰撞的类
{
isJumping = false;//这里不严谨,只要发生任意刚体碰撞就能再次跳动,后面再完善
}
}
然后再去测试游戏,发现小恐龙能只能跳一次了。
-
场景的移动
为了让场景看起来是小恐龙移动,我们这次使用的是视角不动,而是背景移动。
跟上面一样,先创建脚本,然后是使用unity内置的位置函数和时间函数来对游戏对象的位置进行刷新。
public class Movement : MonoBehaviour
{
public float movementSpeed;//移动速度
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
transform.position = new Vector2(transform.position.x - movementSpeed * Time.deltaTime, transform.position.y);
/*这里个人感觉比较复杂
游戏对象改变后的位置 = 原本的x轴位置 减 移动速度×增量时间,y轴不变,这样的效果就是对象向左水平平移
*/
}
}
写好脚本后,同样可以添加到对应的游戏对象中,如果保持整个游戏背景对象的移动速度是一样的,可以直接将脚本添加在父对象上(红色箭头)。如果想要个别对象移动快一点,可以添加在子对象中(绿色箭头),修改一下不同的速度参数就可以了
但是上面这样移动会一直移动到超出镜头范围,为了让背景对象会自动重置,接下来需要添加两个参数,消失点和再生点
public class Movement : MonoBehaviour
{
public float movementSpeed;//移动速度
public float startPosition;//消失点
public float endPosition;//再生点
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
transform.position = new Vector2(transform.position.x - movementSpeed * Time.deltaTime, transform.position.y);
if (transform.position.x <= endPosition)//如果更新后的x坐标小于等于消失点
{
transform.position = new Vector2(startPosition, transform.position.y);//那么这个对象的x轴坐标就重置为再生点坐标
}
}
}
消失点和再生点的值可以直接将游戏对象移动到镜头外,然后看其x轴坐标来设定,因为游戏分辨率问题,最好还是设置远一点,不然可能会在分辨率大的设备中,对象直接在镜头内消失和再生。
而地面,为了保证其连续性,需要创建2~3个地板对象,当其中一个离开摄像头后,就在摄像头以外的地方再生。
有个小问题:地板交替再生时,中间的缝可能会不停变大然后变得不连贯,这个可以通过覆盖一部分地面来解决这个问题(不知道为啥我还是会出现这个问题)
这样就完成了基本操作和场景运动了,后面再写碰撞交互和UI展示