打箱子小游戏案例
2016-12-22 本文已影响0人
_凉笙
一、创建箱子
首先我们先创建一个平面当做地面,然后我们给我们的摄像机挂载一个脚本并且命名为Boxwall。
Paste_Image.png
然后我们打开脚本来创建我们的箱子Cube,让其一运行就创建箱子。并且给其位置Position,添加刚体、给箱子赋材质,并且让其标签(tag)为Player。下面我们来看看我们的代码
public int x, y;//先声明两个变量X和Y,X代表箱子行的数量,Y代表箱子列的数量
public Material Eff;//声明一个材质
// Use this for initialization
void Start () {
if (x==0||y==0)//当刚开始X,Y没有设置数量的时候,我们让其默认为9行6列
{
x = 9;
y = 6;
}
string path = "wall";//在Resources文件下的路径找到该材质Wall
Eff= Resources.Load(path)as Material;//加载出这个材质,让其赋材质给我们开始声明的变量材质Eff
for (int i = 0; i < x; i++)//
{
for (int j = 0; j < y; j++)
{
GameObject wall = GameObject.CreatePrimitive(PrimitiveType.Cube);//创建一个X行Y列的游戏对象Cube
wall.transform.position =new Vector3(-4.3f+i,0.5f+j,4.3f);//给这些游戏对象摆好位置.
wall.GetComponent<Renderer>().material=Eff;//给这些游戏对象赋我们刚刚加载的材质
wall.AddComponent<Rigidbody>();//给这些游戏对象添加刚体
wall.tag = "Player";//让这些游戏对象的tag(标签)等于Player
}
}
}
然后我们运行看看,发现我们的箱子都创建了出来。
Paste_Image.png
二、创建子弹
下面我们来开始创建我们的子弹,让他在碰撞箱子的时的后两秒消失,并且在让其在碰撞的时候显示特效,特效在显示三秒后消失。
public GameObject Zi;
public float speed;
void Update () {
if (Input.GetMouseButtonDown(0)){//当点击鼠标左键时
//返回一条射线,从摄像机到屏幕指定的一个点(鼠标点击的位置)
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;//光线投射碰撞信息
//当光线投射与与任何碰撞器交叉时为真,否则为假
if(Physics.Raycast(ray,out hit)){
Debug.DrawLine(transform.position,hit.point, Color.red);//画出摄像
if(hit.transform.tag=="Player"){//当碰撞的物体标签为Player时
GameObject go= GameObject.Instantiate(Zi);//创建游戏对象子弹
go.transform.position = Camera.main.transform.position;//给子弹设置位置,让其初始位置为摄像机的位置
BoxCollider coll = go.AddComponent<BoxCollider>();//给子弹添加组件碰撞组件.
Rigidbody body= go.AddComponent<Rigidbody>();//给子弹添加刚体组件
body.AddForce((hit.point-transform.position)*speed,ForceMode.Impulse);//给子弹施加一个冲击力,距离是终点位置减去起始位置。
go.AddComponent<destroyqq>();//给子弹添加摧毁子弹的脚本,让其碰撞后三秒消失
go.AddComponent<bull>();//给子弹添加一个脚本让其在碰撞箱子后产生特效
}
}
}
}
两秒后摧毁子弹的destroyqq脚本。
Paste_Image.png
三、产生特效的bull脚本
首先创建一个在Assets文件下创建一个新文件夹并且命名为“Resources”,将我们的特效丢入Resources文件里面,脚本文件如下:bull脚本
public GameObject Eff;
void Start () {
string path = "Power Burst";//在Resources文件下查找该特效
Eff= Resources.Load(path)as GameObject;//加载出这个特效
}
void OnCollisionEnter(Collision coll) {//碰撞方法
GameObject go = GameObject.Instantiate(Eff) as GameObject;//当碰撞的时候创建预制物特效
go.transform.position = coll.transform.position;//给特效位置,位置为碰撞时的位置
Destroy(go, 3f);//让其在产生特效后三秒消失
}
下面我们来运行看看效果吧
111.gif四、制作瞄准器
首先我们找一个透明通道的瞄准器图片导入Unity里面如下图
Paste_Image.png
然后设置图片的参数,将图片的类型设置成2D and UI 。
Paste_Image.png
然后我们打开摄像机上挂载的脚本。
public Texture2D pic;//定义一个瞄准器
void Start () {
Cursor.visible=false;//将鼠标隐藏起来
}
void OnGUI() {
float left = Input.mousePosition.x - pic.width / 2;//瞄准器最中心距离最左边的位置
float top = Screen.height - Input.mousePosition.y - pic.height / 2;//瞄准器最中心距离屏幕最上面的位置
GUI.DrawTexture(new Rect(left,top,pic.width,pic.height), pic);//将图片也就是瞄准器画出来
}
这样我们的瞄准器就做出来了,运行看看
Paste_Image.png
五、制作蓄力池
首先我们需要一张蓄力背景图和一张蓄力图,其长度和宽度分别为200*30.
Paste_Image.png
黑色为背景图,红色为蓄力图,将他们导入到Unity3D中,并将它们的图片类型设置为2D and UI.
然后我们打开摄像机中的脚本.首先我们添加其蓄力背景图。
public Texture2D pic1;//定义蓄力背景图
void OnGUI() {
GUI.DrawTexture(new Rect(20,20,pic1.width,pic1.height), pic1);//添加蓄力背景图
}
位置如下
Paste_Image.png
下面我们来制作动态蓄力。打开脚本
public Texture2D pic2;//定义动态蓄力
public double tims;//记录时间
public float FourcePower;//力度值
void Start () {
// 给一个初始力度值
FourcePower = 5f;
}
####>>>>>>>>>更改以前Update里面的代码,代码如下
void Update () {
//按下鼠标后所记录的时间
if(Input.GetMouseButtonDown(0)){
times = Time.realtimeSinceStartup;
}
//当松开鼠标左键的时候
if (Input.GetMouseButtonUp(0)){
times = 0;//所记录的时间返回为0;
//返回一条射线,从摄像机到屏幕指定的一个点(鼠标点击的位置)
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;//光线投射碰撞信息
//当光线投射与与任何碰撞器交叉时为真,否则为假
if(Physics.Raycast(ray,out hit)){
Debug.DrawLine(transform.position,hit.point, Color.red);//画出摄像
if(hit.transform.tag=="Player"){//当碰撞的物体标签为Player时
GameObject go= GameObject.Instantiate(Zi);//创建游戏对象子弹
go.transform.position = Camera.main.transform.position;//给子弹设置位置,让其初始位置为摄像机的位置
BoxCollider coll = go.AddComponent<BoxCollider>();//给子弹添加组件碰撞组件.
Rigidbody body= go.AddComponent<Rigidbody>();//给子弹添加刚体组件
body.AddForce((hit.point-transform.position)*FourcePower,ForceMode.Impulse);//给子弹施加一个冲击力,距离是终点位置减去起始位置在乘以蓄力的值。
go.AddComponent<destroyqq>();//给子弹添加摧毁子弹的脚本,让其碰撞后三秒消失
go.AddComponent<bull>();//给子弹添加一个脚本让其在碰撞箱子后产生特效
}
}
}
}
void OnGUI() {
if (times>0){
// 记录按下鼠标左键按了多长时间
double t = Time.realtimeSinceStartup;
//时间差值
float time = (float)(t - times);
// 比例
float presslength = time / 3.0f;
// 比例大于1,就设置为1.
if (presslength > 1)
{
presslength = 1;
}
// 绘制力度图,根据比例来绘制
GUI.DrawTexture(new Rect(20, 20, pic2.width * presslength, pic2.height), pic2);
// 子弹的力量 = 比例值 * 常量(最高是5f,最低是0f)
FourcePower = presslength * 5f;
}
}
下面我们来看看效果吧
11.gif
void OnBecameInvisible()//当游戏对象不在摄像机视角的时候
{
Destroy(this.gameObject);//移除该游戏对象
}
六、代码总览
public class boxwall : MonoBehaviour {
public int x, y;//先声明两个变量X和Y,X代表箱子行的数量,Y代表箱子列的数量
public Material Eff;//声明一个材质
public GameObject Zi;
public Texture2D pic;//定义一个瞄准器
public Texture2D pic1;//定义蓄力背景图
public Texture2D pic2;//定义动态蓄力
public double times;//时间
public float FourcePower;//力度值
// Use this for initialization
void Start () {
// 给一个初始力度值
FourcePower = 2f;
if (x==0||y==0)//当刚开始X,Y没有设置数量的时候,我们让其默认为9行6列
{
x = 9;
y = 6;
}
string path = "wall";//在Resources文件下的路径找到该材质Wall
Eff= Resources.Load(path)as Material;//加载出这个材质,让其赋材质给我们开始声明的变量材质Eff
for (int i = 0; i < x; i++)//
{
for (int j = 0; j < y; j++)
{
GameObject wall = GameObject.CreatePrimitive(PrimitiveType.Cube);//创建一个X行Y列的游戏对象Cube
wall.transform.position =new Vector3(-4.3f+i,0.5f+j,4.3f);//给这些游戏对象摆好位置.
wall.GetComponent<Renderer>().material=Eff;//给这些游戏对象赋我们刚刚加载的材质
wall.AddComponent<Rigidbody>();//给这些游戏对象添加刚体
wall.tag = "Player";//让这些游戏对象的tag(标签)等于Player
}
}
Cursor.visible=false;
}
// Update is called once per frame
void Update () {
//按下鼠标的时候记录时间
if(Input.GetMouseButtonDown(0)){
times = Time.realtimeSinceStartup;
}
if (Input.GetMouseButtonUp(0)){//当松开鼠标左键的时候
times = 0;
//返回一条射线,从摄像机到屏幕指定的一个点(鼠标点击的位置)
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;//光线投射碰撞信息
//当光线投射与与任何碰撞器交叉时为真,否则为假
if(Physics.Raycast(ray,out hit)){
Debug.DrawLine(transform.position,hit.point, Color.red);//画出摄像
if(hit.transform.tag=="Player"){//当碰撞的物体标签为Player时
GameObject go= GameObject.Instantiate(Zi);//创建游戏对象子弹
go.transform.position = Camera.main.transform.position;//给子弹设置位置,让其初始位置为摄像机的位置
BoxCollider coll = go.AddComponent<BoxCollider>();//给子弹添加组件碰撞组件.
Rigidbody body= go.AddComponent<Rigidbody>();//给子弹添加刚体组件
body.AddForce((hit.point-transform.position)*FourcePower,ForceMode.Impulse);//给子弹施加一个冲击力,距离是终点位置减去起始位置。
go.AddComponent<destroyqq>();//给子弹添加摧毁子弹的脚本,让其碰撞后三秒消失
go.AddComponent<bull>();//给子弹添加一个脚本让其在碰撞箱子后产生特效
}
}
}
}
void OnGUI() {
float left = Input.mousePosition.x - pic.width / 2;//瞄准器最中心距离最左边的位置
float top = Screen.height - Input.mousePosition.y - pic.height / 2;//瞄准器最中心距离屏幕最上面的位置
GUI.DrawTexture(new Rect(left,top,pic.width,pic.height), pic);//将图片也就是瞄准器画出来
GUI.DrawTexture(new Rect(20,20,pic1.width,pic1.height), pic1);//添加蓄力背景图
if (times>0){
// 记录按下鼠标左键按了多长时间
double t = Time.realtimeSinceStartup;
//时间差值
float time = (float)(t - times);
// 比例
float presslength = time / 3.0f;
// 比例大于1,就设置为1.
if (presslength > 1)
{
presslength = 1;
}
// 绘制力度图,根据比例来绘制
GUI.DrawTexture(new Rect(20, 20, pic2.width * presslength, pic2.height), pic2);
// 子弹的力量 = 比例值 * 常量(最高是5f,最低是0f)
FourcePower = presslength * 5f;
}
}
}
public class bull : MonoBehaviour {
public GameObject Eff;
void Start () {
string path = "Power Burst";//在Resources文件下的路径
Eff= Resources.Load(path)as GameObject;//加载出这个对象
}
void OnCollisionEnter(Collision coll) {//碰撞方法
GameObject go = GameObject.Instantiate(Eff) as GameObject;//当碰撞的时候创建预制物特效
go.transform.position = coll.transform.position;//给特效位置,位置为碰撞时的位置
Destroy(go, 3f);//让其在产生特效后三秒消失
}
}
public class destroyqq : MonoBehaviour {
// Use this for initialization
void Start () {
Destroy(this.gameObject, 2f);
}
// Update is called once per frame
void Update () {
}
}