Unity的学习(二):打砖块

一、新建项目

在这里插入图片描述

创建成功后,进入了如下界面。
在这里插入图片描述

二、场景的设计

在Hierarchy中鼠标右键创建Plane(地面)游戏物体,将其Transform组件重置,并将游戏物体重命名为Ground,如下图所示。
在这里插入图片描述

调整地面的大小。
在这里插入图片描述

在Assets下创建文件夹Materials,并在其中创建Ground的Material(材质)并在Ground(地面)游戏物体上设置材质。如下图所示。(Smoothness为光滑度)
在这里插入图片描述

三、创建砖块和砖块的prefab(预制体)

右键创建Cube,并给该游戏物体添加Rigidbody(刚体)组件,然后创建在Assets下创建Prefabs文件夹,将Cube拖入到Prefabs文件夹下将Cube游戏物体设置为prefab(预制体)。如下图所示。
在这里插入图片描述

Rigidbody:当游戏物体添加了刚体组件,会有物理效果,如重力。
prefab:预制体,相当于模板,当修改预制体时,由此prefab生成的实例也会进行相同的变化。

四、创建墙

通过预制体来创建墙,在Unity中距离的单位为米,而Cube的长度为1,即是1米,当移动时,我们可以按住ctrl键然后通过按住箭头来移动固定的距离。创建墙如下图所示。
在这里插入图片描述

五、创建子弹

通过预制体来创建子弹的实例,因为子弹会有很多个,所以需要用到预制体,并且通过代码来控制子弹的生成。创建子弹如下图所示。
在这里插入图片描述

六、创建C#脚本

在Assets下创建Scripts文件夹,并且创建命名为Shoot的C#脚本文件,然后将脚本文件拖入Main Camera作为一个脚本组件。如下图所示。
在这里插入图片描述

七、子弹的生成

打开Shoot脚本,并定义一个属性public GameObject bullet;,保存,回到Unity,可以看到Main Camera游戏物体中的脚本组件出现了变化,这时可以将Prefabs中的Sphera预制体拖入其中,给其赋值。具体如下图所示。
在这里插入图片描述

在Shoot的Update方法中加入实例化代码用于控制子弹的生成。

// 每帧调用一次
    void Update() {
        //Input.GetMouseButtonDown(0):鼠标左键按下
        if (Input.GetMouseButtonDown(0)) {
            //transform:当前脚本所在游戏物体的transform组件
            //transform.position:这里取得的是当前游戏物体(Camera)的位置
            //transform.rotation:当前游戏物体的旋转角度
            GameObject.Instantiate(bullet, transform.position, transform.rotation);//生成bullet实例
        }
    }

此时运行,点击左键,观察Hierarchy发现,有Sphere实例生成。如下图所示。但是观察Game视图发现,子弹并没有发射出去。
在这里插入图片描述

八、给子弹生成初速度,使其能够发射出去。

我们可以通过Rigidbody(刚体)来给子弹施加速度,这样就可以发射了。
在这里插入图片描述
在Shoot中定义一个属性public float speed=5;
并在Update方法中获取Rigidbody组件,并赋予向前的速度。

//获得Rigidbody(刚体)
Rigidbody rgd = b.GetComponent<Rigidbody>();
//给其赋一个向前的初速度
rgd.velocity = transform.forward * speed;

这时我们运行下看看效果,如下图所示。
在这里插入图片描述
通过运行,我们发现,相机的距离过近需要调整相机距离,并且子弹发射出去进行了翻滚,我们可以通过锁定它的y轴来让它不进行翻滚。如下图所示。
在这里插入图片描述

九、控制相机的上下左右移动

创建C#脚本Movement,并将其挂载到Main Camera上。如下图所示。
在这里插入图片描述

在Movement脚本中添加属性public float speed = 3;
并且在Update方法中添加上下左右移动代码

void Update() {
        //获取左右键的按下
        float h = Input.GetAxis("Horizontal");

        //获取上下键的按下
        float v = Input.GetAxis("Vertical");
        //移动
        //Time.deltaTime:时间修正值
        transform.Translate(new Vector3(h, v, 0) * Time.deltaTime * speed);
    }

十、运行

对子弹速度进行一个调整。
在这里插入图片描述

运行效果如下图所示。
在这里插入图片描述

十一、代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Shoot : MonoBehaviour {

    public GameObject bullet;

    public float speed = 5;

    // 在第一帧更新之前调用Start
    void Start() {
        
    }

    // 每帧调用一次
    void Update() {
        //Input.GetMouseButtonDown(0):鼠标左键按下
        if (Input.GetMouseButtonDown(0)) {
            //transform:当前脚本所在游戏物体的transform组件
            //transform.position:这里取得的是当前游戏物体(Camera)的位置
            //transform.rotation:当前游戏物体的旋转角度
            GameObject b=GameObject.Instantiate(bullet, transform.position, transform.rotation);//生成bullet实例

            //获得Rigidbody(刚体)
            Rigidbody rgd = b.GetComponent<Rigidbody>();
            //给其赋一个向前的初速度
            rgd.velocity = transform.forward * speed;
        }
    }
}

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Movement : MonoBehaviour {

    public float speed = 3;

    // Start is called before the first frame update
    void Start() {

    }

    // Update is called once per frame
    void Update() {
        //获取左右键的按下
        float h = Input.GetAxis("Horizontal");

        //获取上下键的按下
        float v = Input.GetAxis("Vertical");
        //移动
        //Time.deltaTime:时间修正值
        transform.Translate(new Vector3(h, v, 0) * Time.deltaTime * speed);
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章