小项目-Hit Box

这次我们做一个打箱子的小项目,不是推箱子= = 。目标是实现自动生成一堵由箱子(Cube)组成的墙,然后鼠标对准箱子按下左键会蓄力,松开后生成一个子弹(Sphere)射向瞄准的箱子。

首先我们创建一个Scene场景,场景中有一个地面(Plane)和一个空物体(Box,用来做箱子-Cube的父级),如图:


Paste_Image.png

然后我们在脚本中用代码实现自动创造一堵墙,代码如下:

 public GameObject box;//获取我们Scene中的Box空物体
    void Start () {
        //创造墙的代码写在Start方法中,因为游戏一运行就会有一堵墙
        for (int i = 0; i < 18; i++)
        {            
            for (int j = 0; j < 10; j++)
            {
                GameObject go = GameObject.CreatePrimitive(PrimitiveType.Cube);//创造物体Cube做为箱子
                go.transform.localScale = new Vector3(5,5,5);//设置箱子大小
                go.transform.position = new Vector3(-45+i*5,2.5f+j*5,38);//-45和38是根据我的场景位置设置的,i和j分别用来确定箱子的x,y位置
                go.transform.parent = box.transform;//把每一个创造的箱子都变成Box的子级
                go.GetComponent<Renderer>().material.color= new Color(Random.Range(0f, 1f), Random.Range(0f, 1f), Random.Range(0f, 1f));//给箱子加上随机颜色
                go.AddComponent<Rigidbody>();//给箱子加上刚体组件
                go.tag = "Player";//把箱子的tag值设置为Player(在这之前要确保你的Tag里面有Player,否则需要先创造一个名为Player的tag值)
            }
        }
    }

如图是如何创建一个新的Tag值:

Paste_Image.png

运行项目,得到如图所示效果:

Paste_Image.png

接下来我们就需要用鼠标进行交互,自动生成子弹(Sphere),并射向瞄准的箱子,代码如下:

private Vector3 offset;//目标位置和相机位置的向量,也就是子弹射向的方向
    void Update () {
        if (Input.GetMouseButtonDown(0))//按一下鼠标左键(此时射击像手枪,单击一下射一发;如果是GetMouseButton就会像机关枪,按住不动一直射),其中0表示鼠标左键,1是右键
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//射线检测,从主相机发射一条射线到鼠标点击的位置(该脚本就是挂在主相机上面),返回该射线
            RaycastHit hit;//声明一个RaycastHit,有点类似Collision,自行进行对比 = =
            if (Physics.Raycast(ray, out hit))
            {
                if (hit.collider.tag == "Player")//判断鼠标点击的物体是不是箱子
                {
                    GameObject gb = GameObject.CreatePrimitive(PrimitiveType.Sphere);//生成子弹
                    gb.GetComponent<Renderer>().material.color = new Color(Random.Range(0f, 1f), Random.Range(0f, 1f), Random.Range(0f, 1f));//给子弹随机颜色
                    gb.transform.localScale = new Vector3(1,1,1);//设置子弹大小
                    gb.transform.position = transform.position;//设置子弹的初始位置为主相机的位置             
                    offset = hit.transform.position - transform.position;//获取子弹要射向的方向
                    gb.AddComponent<Rigidbody>().AddForce(offset*50);//给子弹加刚体,并给一个力(乘以50是让子弹飞的快)
                    gb.GetComponent<Rigidbody>().collisionDetectionMode = CollisionDetectionMode.Continuous;//因为子弹速度如果太快会穿过箱子或者地面,这时就需要设置一下刚体中的collisionDetectionMode属性,这在刚体中讲过,不再叙述
                    Destroy(gb,2f);//2秒后销毁子弹,因为子弹创造太多会消耗性能
                }
            }
        }
    }

运行效果如图:

Paste_Image.png

下面我们再进行一些改进:把鼠标样式改成一个瞄准星,按下鼠标左键就开始蓄力,蓄力越久,子弹速度越大,子弹碰撞到箱子时产生特效。

更改后的代码如下(鼠标按下发射子弹的方法改成鼠标松开发射,):

 public GameObject box;//获取我们Scene中的Box空物体
    private Vector3 offset;//目标位置和相机位置的向量,也就是子弹射向的方向
    public Texture2D pic;//力度条图片
    public Texture2D mousepic;//要代替鼠标的图片,是一个瞄准星图片
    private float width;//需要绘制的蓄力条长度
    private float forcetime = 3f;//设定蓄力时间最多3秒
    private float timer;//蓄力时间差值
    private float t = 0;//开始蓄力的时间点为0秒;
    private bool isui=false;//判断是否开始绘制蓄力条
    void Start () {
        //Cursor.visible = false;
        //创造墙的代码写在Start方法中,因为游戏一运行就会有一堵墙
        for (int i = 0; i < 18; i++)
        {            
            for (int j = 0; j < 10; j++)
            {
                GameObject go = GameObject.CreatePrimitive(PrimitiveType.Cube);//创造物体Cube做为箱子
                go.transform.localScale = new Vector3(5,5,5);//设置箱子大小
                go.transform.position = new Vector3(-45+i*5,2.5f+j*5,38);//-45和38是根据我的场景位置设置的,i和j分别用来确定箱子的x,y位置
                go.transform.parent = box.transform;//把每一个创造的箱子都变成Box的子级
                go.GetComponent<Renderer>().material.color= new Color(Random.Range(0f, 1f), Random.Range(0f, 1f), Random.Range(0f, 1f));//给箱子加上随机颜色
                go.AddComponent<Rigidbody>();//给箱子加上刚体组件
                go.tag = "Player";//把箱子的tag值设置为Player(在这之前要确保你的Tag里面有Player,否则需要先创造一个名为Player的tag值)
            }
        }
    }    
    void Update () {
        if (Input.GetMouseButtonUp(0))//按一下鼠标左键(此时射击像手枪,单击一下射一发;如果是GetMouseButton就会像机关枪,按住不动一直射),其中0表示鼠标左键,1是右键
        {
            isui = false;//鼠标抬起后不再绘制蓄力条
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//射线检测,从主相机发射一条射线到鼠标点击的位置(该脚本就是挂在主相机上面),返回该射线
            RaycastHit hit;//声明一个RaycastHit,有点类似Collision,自行进行对比 = =
            if (Physics.Raycast(ray, out hit))
            {
                if (hit.collider.tag == "Player")//判断鼠标点击的物体是不是箱子
                {                   
                    GameObject gb = GameObject.CreatePrimitive(PrimitiveType.Sphere);//生成子弹
                    gb.GetComponent<Renderer>().material.color = new Color(Random.Range(0f, 1f), Random.Range(0f, 1f), Random.Range(0f, 1f));//给子弹随机颜色
                    gb.transform.localScale = new Vector3(1, 1, 1);//设置子弹大小
                    gb.transform.position = transform.position;//设置子弹的初始位置为主相机的位置             
                    offset = hit.transform.position - transform.position;//获取子弹要射向的方向
                    gb.AddComponent<Rigidbody>().AddForce(offset * 50f*(forcetime-timer));//给子弹加刚体,并给一个力(乘以50是让子弹飞的快),
                    gb.GetComponent<Rigidbody>().collisionDetectionMode = CollisionDetectionMode.Continuous;//因为子弹速度如果太快会穿过箱子或者地面,这时就需要设置一下刚体中的collisionDetectionMode属性,这在刚体中讲过,不再叙述
                    Destroy(gb, 2f);//2秒后销毁子弹,因为子弹创造太多会消耗性能
                }
            }
        }
        if (Input.GetMouseButtonDown(0))
        {
            isui = true;//鼠标左键按下开始绘制蓄力条
            t = 0;//重置开始蓄力的时间点为0秒;
        }
    }
    void OnGUI()
    {       
        Cursor.SetCursor(mousepic, new Vector2(mousepic.width/2,mousepic.height/2), CursorMode.Auto);//用系统自带的方法更换鼠标图片,图片格式必须是Cursor
        //Vector2 mouse_Pos = Input.mousePosition;//获取鼠标点击位置
        //GUI.DrawTexture(new Rect(mouse_Pos.x-15, Screen.height - mouse_Pos.y-15, 30, 30), mousepic);   //自己绘制鼠标图片,图片的大小可以自己设置;  
        if (isui)
        {
            t += Time.deltaTime;//计时
            timer = Mathf.Clamp((forcetime - t),0f,3f);//该方法获得蓄力时间差值
            width = pic.width - timer/forcetime*pic.width;//计算出需要绘制的蓄力条长度
            GUI.DrawTexture(new Rect(530f, 20f, width, pic.height), pic);//绘制蓄力条
        }
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容

  • 在我们的游戏开发过程中,有一个很重要的工作就是进行碰撞检测。例如在射击游戏中子弹是否击中敌人,在RPG游戏中是否捡...
    壹米玖坤阅读 24,113评论 0 17
  • Unity3D塔防开发流程 配置环境及场景搭建 编程语言:C#,略懂些许设计模式,如果不了解设计模式,BUG Mo...
    Grape_葡萄阅读 2,923评论 1 3
  • 本文来源于两年前我的一篇CSDN博客。CSDN博客本来就没写多少,现在也基本是到简书上混了。所以各位大大请自觉绕过...
    晓梦蝉君阅读 42,491评论 5 12
  • 1. 准备场景 下载并导入官方Space Shooter教程的范例素材包,我们仅使用其中的模型、材质、贴图、Pre...
    shimmery阅读 6,389评论 0 16
  • 嫂子在波士顿工作,那天空间里发了一个乳牙的故事,当时正被工作上的各种纷繁错节搞得头昏脑胀,看到这么简单可爱的小故事...
    璐晓源阅读 260评论 0 1