《FlyingBird》游戏代码讲解(1-5)
第一部分:SportCtrl,对小鸟的运动控制
- 首先获取
Rigidbody2D rb
- 在
下进行初始化void Start
然后定义一个Fly方法,然后再rb = GetComponent<Rigidbody2D>()
下进行调用。void Update
- Fly的方法主要用于监听: 首先定义X方向的速度,在默认情况下,小鸟始终是向右匀速运动
,然后从缸体上获取一下小鸟竖直方向的速度float xSpeed = 1f
Vector3 v = rb.velocity
- 对鼠标左键进行监听,当按住鼠标左键时,小鸟会获得一个持续向上的速度
if (Input.GetMouseButton(0))
,当松开鼠标左键的时候,小鸟就会坠落。
当每次按下鼠标,我们把竖直方向的速度改为2米每秒向上运动。
- 然后再修改我们缸体的速度
rb.velocity = new Vector3(xSpeed, ySpeed, 0)
第二部分:CameraCtrl,摄像机跟随以及高度限制
- 首先
定义一个目标,表示它是主角,要跟随小鸟。“public Transform target”
- 其次在定义一个
,表示要跟随的目标的一个偏移量。"offset"
- 然后
,意味着在游戏开始的第一帧记录下摄像机与小鸟的距离。"void Start"下使“offset”=“transform.position - target.position”
- 在
,意为在每一帧修改相机的一个位置。“void Update”下使“transform.position"="target.posiyion+offset"
- 此时我们会发现,相机已经可以跟随小鸟移动,但在小鸟位置过高时,会出现场景穿帮现象,所以我们需要限制一下相机高度,我们此时继续编辑我们"CameraCtrl"代码。
- 首先将
,其次再将“void Update”改为“void LateUpdate”
(目标位置)“transform.position"改为“Vector3 pos”
- 然后在相机位置修改代码下加入一个判断。根据实际场景判断摄像机的最高位置为多少,则“pos.y>1.97”(此数值为我们要求的最大高度,数值可根据实际场景位置进行修改)
- 判定完最大数值后加入条件,此时完整代码应为
意为,当摄像机位置大于1.97时,修改摄像机位置为1.97。判定完最高位置后,我们还需判定最低位置,判定方法和要求同上,此时完整代码为if (pos.y > 1.97) { pos.y=1.97f; }
意为最低位置为-1.97,当摄像机位置低于-1.97时修改摄像机位置为-1.97*。else if (pos.y < -1.97) { pos.y = -1.97f; }
- 最后使
我们的CameraCtrl代码就完成了transform.position = pos;
第三部分:Endless,场景的循环
EndLess代码要实现的目标是,在仅使用三块预置场景的情况下,完成场景的循环出现。
- 首先要判断什么时候消失。
- 定义
public float distance
-
private void OnBecameInvisible()
(表示继承了OnBecameInvisible),这是MonoBehaviour自带的方法
,当某一块场景对相机不可见的时候,对这块场景进行移动。
因为我们的天空,地面,水管所要移动的位置是不同的,所以我们需要在外部对它进行设置,又因为它们有一个向右移动的共同原则,所以此时代码应为
transform.Translate(Vector3.right*distance*3);
(distance为地面位置)
这样我们的EndLess代码就完成了,在返回unity界面后要记得,将脚本挂在地面,天空上,然后根据实际场景位置填写要场景要移动的距离,如下
第四部分:RandomHeight,水管出现的随机高度
此代码的目标是为实现水管出现的随机高度。
- -
在水管可见的状态下进行调整。private void OnBecameVisible()
- 首先定义一个位置
然后将pos.y的高度设置为一个随机数,高度位置范围为(5,3.91)之间Vector3 pos = transform.position
pos.y = Random.Range(5, 3.91f)
- 最后将
transform.position = pos
我们的RandomHeight代码就完成了。
第五部分:GameRoot(游戏管理器),
GameRoot为游戏的根脚本。
在
void Start
下对“Instance”进行复制
然后创建游戏默认状态,(共四个)
- 开始状态
public const int GAMESTART = 0
- 准备状态
public const int GAMEREADY = 1
- 运行状态
public const int GAMERUN = 2
- 结束状态
public const int GAMEEND = 3
(后面数字只要为不同的数字就行)
游戏有一个全局变量
public int GAMESTATE = GAMESTART
默认游戏状态为“GAMESTATE”=“GAMESTART”
接下来引用我们所创建的四个UI
public Transform startwnd, readywnd, endwnd, bird
在维护一个text
public Text txtscore
用来记录分数
public int score=0
(默认分数等于0)
然后创建以下几个方法:
1
public void Enter()
{
StartWnd.gameObject.SetActive(true);
GAMESTATE = GAMESTART;
}
当进入游戏时候“StartWnd”就会显示出来,此时游戏处于开始状态
2
public void Ready()
{
ReadyWnd.gameObject.SetActive(true);
StarWnd.gameObject.SetActive(false);
bird.position = Vector3.zero;
GAMESTATE = GAMEREADY;
bird.rotation = Quaternion.identity;
}
当进入准备状态时“StarWnd”就会消失,小鸟的位置归零进入默认位置,小鸟的旋转也会归零。游戏进入准备状态
3
public void Run()
{
ReadyWnd.gameObject.SetActive(false);
GAMESTATE = GAMERUN;
}
游戏开始后“ReadyWnd”会消失,游戏就会进入运行状态
4
public void End()
{
EndWnd.gameObject.SetActive(true);
GAMESTATE = GAMEEND;
}
游戏结束时“EndWnd”就会出现,游戏进入结束状态。
以上仅为个人理解,如有错误和不同意见,欢迎指正。