小項目-Hit Box

這次我們做一個打箱子的小項目,不是推箱子= = 忍疾。目標是實現(xiàn)自動生成一堵由箱子(Cube)組成的墻蹈集,然后鼠標對準箱子按下左鍵會蓄力闺兢,松開后生成一個子彈(Sphere)射向瞄準的箱子。

首先我們創(chuàng)建一個Scene場景帽揪,場景中有一個地面(Plane)和一個空物體(Box硝清,用來做箱子-Cube的父級),如圖:


Paste_Image.png

然后我們在腳本中用代碼實現(xiàn)自動創(chuàng)造一堵墻转晰,代碼如下:

 public GameObject box;//獲取我們Scene中的Box空物體
    void Start () {
        //創(chuàng)造墻的代碼寫在Start方法中芦拿,因為游戲一運行就會有一堵墻
        for (int i = 0; i < 18; i++)
        {            
            for (int j = 0; j < 10; j++)
            {
                GameObject go = GameObject.CreatePrimitive(PrimitiveType.Cube);//創(chuàng)造物體Cube做為箱子
                go.transform.localScale = new Vector3(5,5,5);//設置箱子大小
                go.transform.position = new Vector3(-45+i*5,2.5f+j*5,38);//-45和38是根據(jù)我的場景位置設置的,i和j分別用來確定箱子的x查邢,y位置
                go.transform.parent = box.transform;//把每一個創(chuàng)造的箱子都變成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防嗡,否則需要先創(chuàng)造一個名為Player的tag值)
            }
        }
    }

如圖是如何創(chuàng)建一個新的Tag值:

Paste_Image.png

運行項目,得到如圖所示效果:

Paste_Image.png

接下來我們就需要用鼠標進行交互侠坎,自動生成子彈(Sphere)蚁趁,并射向瞄準的箱子,代碼如下:

private Vector3 offset;//目標位置和相機位置的向量实胸,也就是子彈射向的方向
    void Update () {
        if (Input.GetMouseButtonDown(0))//按一下鼠標左鍵(此時射擊像手槍他嫡,單擊一下射一發(fā);如果是GetMouseButton就會像機關槍庐完,按住不動一直射)钢属,其中0表示鼠標左鍵,1是右鍵
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//射線檢測门躯,從主相機發(fā)射一條射線到鼠標點擊的位置(該腳本就是掛在主相機上面)淆党,返回該射線
            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秒后銷毀子彈荷憋,因為子彈創(chuàng)造太多會消耗性能
                }
            }
        }
    }

運行效果如圖:

Paste_Image.png

下面我們再進行一些改進:把鼠標樣式改成一個瞄準星,按下鼠標左鍵就開始蓄力褐望,蓄力越久勒庄,子彈速度越大串前,子彈碰撞到箱子時產(chǎn)生特效。

更改后的代碼如下(鼠標按下發(fā)射子彈的方法改成鼠標松開發(fā)射实蔽,):

 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;
        //創(chuàng)造墻的代碼寫在Start方法中玩荠,因為游戲一運行就會有一堵墻
        for (int i = 0; i < 18; i++)
        {            
            for (int j = 0; j < 10; j++)
            {
                GameObject go = GameObject.CreatePrimitive(PrimitiveType.Cube);//創(chuàng)造物體Cube做為箱子
                go.transform.localScale = new Vector3(5,5,5);//設置箱子大小
                go.transform.position = new Vector3(-45+i*5,2.5f+j*5,38);//-45和38是根據(jù)我的場景位置設置的,i和j分別用來確定箱子的x贼邓,y位置
                go.transform.parent = box.transform;//把每一個創(chuàng)造的箱子都變成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阶冈,否則需要先創(chuàng)造一個名為Player的tag值)
            }
        }
    }    
    void Update () {
        if (Input.GetMouseButtonUp(0))//按一下鼠標左鍵(此時射擊像手槍,單擊一下射一發(fā)塑径;如果是GetMouseButton就會像機關槍女坑,按住不動一直射),其中0表示鼠標左鍵统舀,1是右鍵
        {
            isui = false;//鼠標抬起后不再繪制蓄力條
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//射線檢測匆骗,從主相機發(fā)射一條射線到鼠標點擊的位置(該腳本就是掛在主相機上面),返回該射線
            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秒后銷毀子彈烹吵,因為子彈創(chuàng)造太多會消耗性能
                }
            }
        }
        if (Input.GetMouseButtonDown(0))
        {
            isui = true;//鼠標左鍵按下開始繪制蓄力條
            t = 0;//重置開始蓄力的時間點為0秒碉熄;
        }
    }
    void OnGUI()
    {       
        Cursor.SetCursor(mousepic, new Vector2(mousepic.width/2,mousepic.height/2), CursorMode.Auto);//用系統(tǒng)自帶的方法更換鼠標圖片,圖片格式必須是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);//繪制蓄力條
        }
    }
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市凉蜂,隨后出現(xiàn)的幾起案子琼梆,更是在濱河造成了極大的恐慌,老刑警劉巖窿吩,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茎杂,死亡現(xiàn)場離奇詭異,居然都是意外死亡爆存,警方通過查閱死者的電腦和手機蛉顽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門蝗砾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來先较,“玉大人携冤,你說我怎么就攤上這事∠猩祝” “怎么了曾棕?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長菜循。 經(jīng)常有香客問我翘地,道長,這世上最難降的妖魔是什么癌幕? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任嫡锌,我火速辦了婚禮幌绍,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己且改,他們只是感情好,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布软能。 她就那樣靜靜地躺著俗扇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪初坠。 梳的紋絲不亂的頭發(fā)上和簸,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機與錄音碟刺,去河邊找鬼锁保。 笑死,一個胖子當著我的面吹牛半沽,可吹牛的內(nèi)容都是我干的身诺。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼抄囚,長吁一口氣:“原來是場噩夢啊……” “哼霉赡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起幔托,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤穴亏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后重挑,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嗓化,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年谬哀,在試婚紗的時候發(fā)現(xiàn)自己被綠了刺覆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡史煎,死狀恐怖谦屑,靈堂內(nèi)的尸體忽然破棺而出驳糯,到底是詐尸還是另有隱情,我是刑警寧澤氢橙,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布酝枢,位于F島的核電站,受9級特大地震影響悍手,放射性物質(zhì)發(fā)生泄漏帘睦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一坦康、第九天 我趴在偏房一處隱蔽的房頂上張望竣付。 院中可真熱鬧,春花似錦滞欠、人聲如沸卑笨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赤兴。三九已至,卻和暖如春隧哮,著一層夾襖步出監(jiān)牢的瞬間桶良,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工沮翔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留陨帆,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓采蚀,卻偏偏與公主長得像疲牵,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子榆鼠,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容

  • 在我們的游戲開發(fā)過程中纲爸,有一個很重要的工作就是進行碰撞檢測。例如在射擊游戲中子彈是否擊中敵人妆够,在RPG游戲中是否撿...
    壹米玖坤閱讀 24,229評論 0 17
  • Unity3D塔防開發(fā)流程 配置環(huán)境及場景搭建 編程語言:C#识啦,略懂些許設計模式,如果不了解設計模式神妹,BUG Mo...
    Grape_葡萄閱讀 2,931評論 1 3
  • 本文來源于兩年前我的一篇CSDN博客颓哮。CSDN博客本來就沒寫多少,現(xiàn)在也基本是到簡書上混了鸵荠。所以各位大大請自覺繞過...
    曉夢蟬君閱讀 42,538評論 5 12
  • 1. 準備場景 下載并導入官方Space Shooter教程的范例素材包冕茅,我們僅使用其中的模型、材質(zhì)、貼圖姨伤、Pre...
    shimmery閱讀 6,405評論 0 16
  • 嫂子在波士頓工作哨坪,那天空間里發(fā)了一個乳牙的故事,當時正被工作上的各種紛繁錯節(jié)搞得頭昏腦脹姜挺,看到這么簡單可愛的小故事...
    璐曉源閱讀 264評論 0 1