天天看点

《FlyingBird》小游戏代码部分讲解(1-5)第一部分:SportCtrl,对小鸟的运动控制

《FlyingBird》游戏代码讲解(1-5)

第一部分:SportCtrl,对小鸟的运动控制

《FlyingBird》小游戏代码部分讲解(1-5)第一部分:SportCtrl,对小鸟的运动控制
  • 首先获取

    Rigidbody2D rb

  • void Start

    下进行初始化

    rb = GetComponent<Rigidbody2D>()

    然后定义一个Fly方法,然后再

    void Update

    下进行调用。
  • Fly的方法主要用于监听: 首先定义X方向的速度,在默认情况下,小鸟始终是向右匀速运动

    float xSpeed = 1f

    ,然后从缸体上获取一下小鸟竖直方向的速度

    Vector3 v = rb.velocity

  • 对鼠标左键进行监听,当按住鼠标左键时,小鸟会获得一个持续向上的速度

    if (Input.GetMouseButton(0))

    ,当松开鼠标左键的时候,小鸟就会坠落。

    当每次按下鼠标,我们把竖直方向的速度改为2米每秒向上运动。

  • 然后再修改我们缸体的速度

    rb.velocity = new Vector3(xSpeed, ySpeed, 0)

第二部分:CameraCtrl,摄像机跟随以及高度限制

《FlyingBird》小游戏代码部分讲解(1-5)第一部分:SportCtrl,对小鸟的运动控制
  • 首先

    “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”(此数值为我们要求的最大高度,数值可根据实际场景位置进行修改)
  • 判定完最大数值后加入条件,此时完整代码应为

    if (pos.y > 1.97) { pos.y=1.97f; }

    意为,当摄像机位置大于1.97时,修改摄像机位置为1.97。判定完最高位置后,我们还需判定最低位置,判定方法和要求同上,此时完整代码为

    else if (pos.y < -1.97) { pos.y = -1.97f; }

    意为最低位置为-1.97,当摄像机位置低于-1.97时修改摄像机位置为-1.97*。
  • 最后使

    transform.position = pos;

    我们的CameraCtrl代码就完成了

第三部分:Endless,场景的循环

《FlyingBird》小游戏代码部分讲解(1-5)第一部分:SportCtrl,对小鸟的运动控制

EndLess代码要实现的目标是,在仅使用三块预置场景的情况下,完成场景的循环出现。

  • 首先要判断什么时候消失。
  • 定义

    public float distance

  • private void OnBecameInvisible()

    (表示继承了OnBecameInvisible),这是MonoBehaviour自带的方法

    ,当某一块场景对相机不可见的时候,对这块场景进行移动。

    因为我们的天空,地面,水管所要移动的位置是不同的,所以我们需要在外部对它进行设置,又因为它们有一个向右移动的共同原则,所以此时代码应为

    transform.Translate(Vector3.right*distance*3);

    (distance为地面位置)

    这样我们的EndLess代码就完成了,在返回unity界面后要记得,将脚本挂在地面,天空上,然后根据实际场景位置填写要场景要移动的距离,如下

    《FlyingBird》小游戏代码部分讲解(1-5)第一部分:SportCtrl,对小鸟的运动控制

第四部分:RandomHeight,水管出现的随机高度

《FlyingBird》小游戏代码部分讲解(1-5)第一部分:SportCtrl,对小鸟的运动控制

此代码的目标是为实现水管出现的随机高度。

  • -

    private void OnBecameVisible()

    在水管可见的状态下进行调整。
  • 首先定义一个位置

    Vector3 pos = transform.position

    然后将pos.y的高度设置为一个随机数,高度位置范围为(5,3.91)之间

    pos.y = Random.Range(5, 3.91f)

  • 最后将

    transform.position = pos

我们的RandomHeight代码就完成了。

第五部分:GameRoot(游戏管理器),

《FlyingBird》小游戏代码部分讲解(1-5)第一部分:SportCtrl,对小鸟的运动控制
《FlyingBird》小游戏代码部分讲解(1-5)第一部分:SportCtrl,对小鸟的运动控制

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”就会出现,游戏进入结束状态。

以上仅为个人理解,如有错误和不同意见,欢迎指正。