美文网首页
打箱子小游戏案例

打箱子小游戏案例

作者: _凉笙 | 来源:发表于2016-12-22 23:15 被阅读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 () {
        
        }
    
    }
    

    相关文章

      网友评论

          本文标题:打箱子小游戏案例

          本文链接:https://www.haomeiwen.com/subject/swyhvttx.html