Unity的学习(二):打砖块

    技术2022-07-10  82

    一、新建项目

    创建成功后,进入了如下界面。

    二、场景的设计

    在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); } }
    Processed: 0.023, SQL: 9