打箱子小游戏案例

一、创建箱子

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

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

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