在Hierarchy中鼠标右键创建Plane(地面)游戏物体,将其Transform组件重置,并将游戏物体重命名为Ground,如下图所示。
调整地面的大小。
在Assets下创建文件夹Materials,并在其中创建Ground的Material(材质)并在Ground(地面)游戏物体上设置材质。如下图所示。(Smoothness为光滑度)
右键创建Cube,并给该游戏物体添加Rigidbody(刚体)组件,然后创建在Assets下创建Prefabs文件夹,将Cube拖入到Prefabs文件夹下将Cube游戏物体设置为prefab(预制体)。如下图所示。
Rigidbody:当游戏物体添加了刚体组件,会有物理效果,如重力。
prefab:预制体,相当于模板,当修改预制体时,由此prefab生成的实例也会进行相同的变化。
通过预制体来创建墙,在Unity中距离的单位为米,而Cube的长度为1,即是1米,当移动时,我们可以按住ctrl键然后通过按住箭头来移动固定的距离。创建墙如下图所示。
通过预制体来创建子弹的实例,因为子弹会有很多个,所以需要用到预制体,并且通过代码来控制子弹的生成。创建子弹如下图所示。
在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);
}
}