打箱子小游戏案例

一、创建箱子

首先我们先创建一个平面当做地面,然后我们给我们的摄像机挂载一个脚本并且命名为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 () {
    
    }

}

推荐阅读更多精彩内容

  • 这次我们做一个打箱子的小项目,不是推箱子= = 。目标是实现自动生成一堵由箱子(Cube)组成的墙,然后鼠标对准箱...
    S_H_C阅读 276评论 0 0
  • 1.设置右侧索引字体颜色 2.设置右侧索引背景色 3.显示每组标题索引 4.返回每个索引的内容 5.响应点击索引时...
    Yeso阅读 3,908评论 0 0
  • 一说同学会,人人五味杂陈。要想在这当中找出规律来,也纯属瞎子点灯。 想也是,但凡识字的,谁没有个几十上百号同学。如...
    醉爱清风笑阅读 72评论 0 2
  • 文|读到小编 古人倦夜长。 如果你也倦夜长,很可能也是一个古人。 李敬泽在谢弗的《撒马尔罕的金桃》中隐约看到《酉阳...
    读到阅读 78评论 2 1
  • 本文参考自:http://www.cnblogs.com/leskang/p/5445698.html 感谢木叔...
    暗香抚动阅读 2,145评论 0 2