DEMO介绍
有一面由许多小矩形块拼起来的墙,游戏的玩法就是通过鼠标左键点击发射小圆球,小圆球撞击墙体,使组成墙体的矩形块被冲撞开。
游戏展示
开发流程
创建开发环境,新建项目
新建项目(这里我是拿Unity 202.3.1的版本)。
创建地面
给地面一个颜色。 将GroundM材质拖给Ground即可。
创建墙体
由于墙体是有多个相同的小矩形拼成的,所以用预制体(Prefab)来做一个小矩形的模板,然后其他的小矩形根据这个模板来生成也就是实例化。 同样的给它一个颜色。 然后再Assets目录下创建一个Prefabs的目录,将Brick拖入Prefabs中去,这样一个预制体就做好了~(可以观察Brick左边的图标是否变蓝来判断预制体是否制作成功)。
然后我们可以选中Brick这个方块,按下Ctrl + D就可以对该预制体进行复制,然后在Scene界面下调整各个方块的摆放位置。
然后给预制体小球加上刚体组件,不然就做不到物理碰撞。
最后做完的样子。 在Scene下用鼠标拖动调制Brick方块的位置时可能会拖动得不精确,这个时候我们可以按住Ctrl再用鼠标拖动就可以根据步长来移动,这个移动的步长也可以进行修改。
制作子弹小球
同墙体制作差不多,射出的小球都是一样的,所以也要用到预制体。 给小球调整好大小,设置好颜色,然后拖入Prefabs文件夹中即可。 给小球添加刚体组件,不然就不能做物理碰撞。
移动视野
游戏就如同电影,相机拍到什么,我们才能看到什么。 我们可以通过改变相机的位置角度,从而达到移动视野的目的。 在Assets文件夹下创建一个Scripts文件夹,该文件夹存放我们所有写的Script脚本文件。 这里我们新建一个CameraMove的脚本文件来实现相机的移动。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraMove : MonoBehaviour
{
public int speed = 1; // 镜头移动速度
public int rotateSpeed = 1; // 镜头随着鼠标移动的速度
// Start is called before the first frame update
// 初始化操作
void Start()
{
}
// Update is called once per frame
// 每一帧执行的动作
void Update()
{
float h = Input.GetAxis("Horizontal"); // 得到的是一个-1到1的中间的值(-1,1),h代表的是水平的,v代表的是垂直的
float v = Input.GetAxis("Vertical");
float x = Input.GetAxis("Mouse X") * rotateSpeed; // 获取鼠标在屏幕上的x坐标
float y = Input.GetAxis("Mouse Y") * rotateSpeed; // 获取鼠标在屏幕上的y坐标
transform.Translate(new Vector3(h,v,0) * speed * Time.deltaTime); //当前帧运动的距离,Time.deltaTime表示的是当前帧到当前帧结束所需要的时间
transform.localRotation = transform.localRotation * Quaternion.Euler(-y,x,0); //镜头随着鼠标动
}
//private void FixedUpdate 一秒执行50帧动作,每帧执行0.02秒,可以修改 在Edit-> Project Settings-> Time-> FixedTimestep中修改
}
将写好的CameraMove脚本拖给Main Camera,这样我们游戏中的视野就可以动了。
射击功能
步骤同上面的CameraMove脚本一样。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Shoot : MonoBehaviour
{
public GameObject BulletPrefab;
// Start is called before the first frame update
void Start()
{
// GameObject.Instantiate(BulletPrefab,transform.position,transform.rotation); //实例化一个prefab的一个对象
}
// Update is called once per frame
void Update()
{
if (Input.GetMouseButtonDown(0))
{
GameObject bullet = GameObject.Instantiate(BulletPrefab,transform.position,transform.rotation); // 实例化,实例化的小球的位置跟相机的位置以及角度相同
Rigidbody rd = bullet.GetComponent<Rigidbody>();
// 两种给小球速度的方式,一种是给一个带方向的力,另一种是给一个带方向的速度
// rd.AddForce(Vector3.forward); //给子弹一个向前为1牛顿的力,每一帧给一牛
Ray mouseRay= Camera.main.ScreenPointToRay(Input.mousePosition); // 生成以摄像机为起点经鼠标点位置的射线
rd.velocity = mouseRay.direction * 35; // 设置子弹的速度,这个速度有方向
}
}
}
将该脚本拖给Main Camera。 同时也要讲预制体Bullet拖给Shoot脚本中对应的属性。
最后
就可以开始射击了,biubiubiu~。
|