从零开始入门创作游戏——游戏对象的脚本编辑

做教程远比自己开发游戏要花时间...继续写小恐龙的游戏教程

环境搭建在这里

从零开始入门创作游戏——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展示

猜你喜欢

转载自blog.csdn.net/dwe147/article/details/126878197
今日推荐