Unity3D開(kāi)發(fā)飛盤(pán)射擊案例之飛盤(pán)射擊(十七)

本節(jié)要點(diǎn)

1.飛盤(pán)射擊

1.飛盤(pán)預(yù)制體制作

①材質(zhì)球處理;

②飛盤(pán)子物體添加碰撞器终畅;

③飛盤(pán)子物體添加 Tag 標(biāo)簽默垄;


2.飛盤(pán)射擊

鼠標(biāo)碰到飛盤(pán)惊搏,并且此時(shí)按下鼠標(biāo)左鍵邪意,就立刻將飛盤(pán)干掉骨望。


Transform.parent:屬性粪牲,當(dāng)前物體的父物體斗塘。

Transform.GetComponentsInChildren<T>()赢织;

獲取所有子物體的某個(gè)組件。


GameObject.AddComponent<T>():給游戲物體添加組件馍盟。


3.自動(dòng)生成飛盤(pán)

創(chuàng)建一個(gè)新的腳本于置,用于管理所有的飛盤(pán)。


Transform.SetParent(Transform)贞岭;

將當(dāng)前的物體設(shè)置為另一個(gè)物體的子物體八毯。


2.添加聲音

1.添加背景音效

給攝像機(jī)添加一個(gè)聲音源組件,用于播放背景聲音瞄桨,自動(dòng)播放话速,且是循環(huán)模式。



2.添加射擊音效

給角色模型添加一個(gè)聲音源組件芯侥,用于播放射擊聲音泊交,默認(rèn)不播放乳讥,每射擊一次,

就播放一次廓俭。



到目前為止云石,很多人可能感覺(jué)案例已經(jīng)完畢了。

但是研乒,我很負(fù)責(zé)任的告訴各位汹忠,案例剛剛開(kāi)始而已!1尽宽菜!



關(guān)鍵代碼

Weapon

public class Weapon : MonoBehaviour {

    //手臂指向鼠標(biāo)點(diǎn)擊的位置
    //聲明一個(gè)手臂位置的變量;
    private Transform m_transform;


    //利用射線去檢測(cè)
    //聲明一個(gè)射線的變量 聲明一個(gè)存貯射線信息存貯的變量
    private Ray ray;
    private RaycastHit hit;


    //定義一個(gè)槍口位置的變量橄唬;
    private Transform m_Point;




    //設(shè)置特效 線渲染器屬性組件 變量

   private LineRenderer m_LineRenderer;



    //設(shè)置特效的聲音源 射擊聲
   private AudioSource m_AudioSource;

    
    void Start () {
        //將Transform 位置賦值
        m_transform=gameObject.GetComponent<Transform>();

        //槍口位置賦值;
      //  m_Point = gameObject.transform.FindChild("Point").GetComponent<Transform>(); 
        m_Point = m_transform.FindChild("Point");


        //特效渲染器組件位置賦值参歹;關(guān)鍵語(yǔ)法  利用槍口的位置設(shè)置仰楚; 先將查找到的組件 linerenderer 存貯起來(lái)

      m_LineRenderer = m_Point.gameObject.GetComponent<LineRenderer>();


        //將聲音源賦值;通過(guò)查找武器父類獲得下面的射擊聲音源犬庇; 不要勾選paly on awake  和loop僧界;
      m_AudioSource = gameObject.GetComponent<AudioSource>();


    }
    
    
    void Update () {
    
        //使手臂朝向鼠標(biāo)點(diǎn)擊的位置;

        //接收射線的變量  利用攝像機(jī)獲取射線并賦值臭挽;
        ray = Camera.main.ScreenPointToRay(Input.mousePosition);//從屏幕發(fā)射到鼠標(biāo)點(diǎn)擊的位置的射線捂襟;
        //進(jìn)行物理檢測(cè) 
        if (Physics.Raycast(ray, out hit))
        {
            //控制手臂的方向
            //檢測(cè)成功后調(diào)用 游戲?qū)ο笪恢玫? 朝向 方法 lookat
           m_transform.LookAt(hit.point);//參數(shù)是碰撞點(diǎn)


            //檢查是否有碰撞;
            //Debug.Log("Collider");
            //場(chǎng)景中沒(méi)有任何碰撞體 或者打開(kāi)場(chǎng)景的屬性檢查欢峰;所以手臂不會(huì)移動(dòng)

            //因此 要添加網(wǎng)格碰撞器 選中 游戲物體 add component  加組件 mesh Collider葬荷; 
            //但是默認(rèn)的有4千個(gè)頂點(diǎn),ui設(shè)計(jì)的只有2千頂點(diǎn)的簡(jiǎn)模 所以用ui的添加碰撞器



            //成功測(cè)試后纽帖,發(fā)現(xiàn)手的旋轉(zhuǎn)關(guān)節(jié)不對(duì)宠漩,就是手是手臂的中心點(diǎn) 可以定義一個(gè)父類來(lái)控制它 不要以為手臂的中心點(diǎn)來(lái)控制
            //建立一個(gè)父類,把之前的代碼組件移除  設(shè)置好父類坐標(biāo)懊直,將腳本掛載到父類組件去


            //繪制槍口發(fā)射線  
           //與繪制射線方法相同 Debug.DrawRay();
          // Debug.DrawLine(m_transform.position,hit.point,Color.red);//參數(shù)1: 起始位置 參數(shù)2:射線碰撞的位置 參數(shù)3:顏色扒吁;


        //射線出發(fā)的位置不對(duì) 所以定義一個(gè)空物體存貯槍口的位置 transform
            //怎么查找父類下的組件呢?
           //gameObject.transform.Find("Point");
            //如果游戲?qū)ο笙旅嬗蠳個(gè)叫Point的組件呢室囊;所以我們只要查找父類下的組件名稱即可雕崩;
          // m_Point = gameObject.transform.FindChild("Point").GetComponent<Transform>(); // 這是賦值過(guò)程,寫(xiě)到Start方法即可融撞;

            //再次繪制射線盼铁;
           Debug.DrawLine(m_Point.position, hit.point, Color.red);


            //繪制特效線的位置;注意關(guān)鍵函數(shù) 
          m_LineRenderer.SetPosition(0,m_Point.position);//參數(shù)1:特效起始位置的下標(biāo) 參數(shù)2:特效起始位置下標(biāo)的位置 (槍口位置)
         m_LineRenderer.SetPosition(1,hit.point);//參數(shù)1:特效結(jié)束位置的下標(biāo) 參數(shù)2:特效結(jié)束位置下標(biāo)的位置 (射線碰撞點(diǎn))



            //射線檢測(cè)碰撞體后將飛盤(pán)擊破
            //判斷條件 碰撞體的標(biāo)簽并且按下鼠標(biāo)左鍵
         if (hit.collider.tag=="FeiPan"&&Input.GetMouseButtonDown(0))
         {
             //如果射擊到尝偎,就播放聲音捉貌;在Start()中已賦值;
             m_AudioSource.Play();






             //通過(guò)碰撞到的子組件查找到父類 Transform
             Transform parent = hit.collider.gameObject.GetComponent<Transform>().parent;//注意組件是單數(shù)



            //通過(guò)父類查找到子類下所有的Transform組件;得到的是一個(gè)數(shù)組

             Transform[] feiPans=parent.GetComponentsInChildren<Transform>();//注意組件是復(fù)數(shù)


             //要實(shí)現(xiàn)往下掉落趁窃,必須動(dòng)態(tài)添加剛體組件
             //通過(guò)for循環(huán)牧挣,Transform點(diǎn)出來(lái)符物體,然后添加剛體組件
             for (int i = 0; i <feiPans.Length; i++)
             {
                 //通過(guò)子物體組件尋找出父類添加剛體組件醒陆;模擬掉落效果瀑构;不用接收賦值;
                 feiPans[i].gameObject.AddComponent<Rigidbody>();


             }


             //18個(gè)組件掉落后一直掉落并沒(méi)有銷(xiāo)毀刨摩,必須把父物體銷(xiāo)毀
             //2秒后寺晌,銷(xiāo)毀父物體 通過(guò)transform 點(diǎn)出來(lái) 父物體組件 銷(xiāo)毀的gameobject
             GameObject.Destroy(parent.gameObject,2.0f);

             
         }


        }



    }
}

FeiPanMannger

public class FeiPanMannger : MonoBehaviour {


    //定義一個(gè)游戲?qū)ο笥脕?lái)存貯預(yù)置體的;
    public GameObject prefab_feiPan;
    

    //定義一個(gè)飛盤(pán)的Transform組件 用來(lái)接收然后吧它設(shè)置成父類的組件
    private Transform m_Transform;

    void Start () {
     //協(xié)程
    //每隔2秒調(diào)用一次 注意關(guān)鍵語(yǔ)句 方法名為字符串 注意括號(hào)為英文半角格式澡刹;
        InvokeRepeating("CreateFeiPan",2.0f,2.0f);



        //將m_Transform組件賦值呻征;
        m_Transform=gameObject.GetComponent<Transform>();
    }

    /// <summary>
    /// 創(chuàng)建生成飛盤(pán);
    /// </summary>
    void CreateFeiPan() { 
    
    
        //先獲取飛盤(pán)的位置罢浇;
        //Vector3 pos = new Vector3(Random.Range(-4.0f,4.0f),Random.Range(0.5f,1.5f),Random.Range(4.0f,13.0f));

        ////實(shí)例化生成飛盤(pán) 
        //GameObject.Instantiate(prefab_feiPan,pos,Quaternion.identity);


        //發(fā)現(xiàn)以上方法生成太慢陆赋;一次生成3個(gè);

        for (int i = 0; i < 3; i++)
        {
            Vector3 pos = new Vector3(Random.Range(-4.0f,4.0f),Random.Range(1.0f,3.5f),Random.Range(8.0f,13.0f));
          
            //GameObject.Instantiate(prefab_feiPan,pos,Quaternion.identity);
            //將實(shí)例化的飛盤(pán)存貯起來(lái)
            GameObject go = GameObject.Instantiate(prefab_feiPan, pos, Quaternion.identity) as GameObject;
            //將游戲?qū)ο笙芦@得Transform組件 設(shè)置成父類組件 參數(shù):m_Transform;
            //給生成的飛盤(pán)設(shè)置成一個(gè)服物體嚷闭;
            go.GetComponent<Transform>().SetParent(m_Transform);
        }
    
    }

    void Update () {
    
    }
}

小結(jié)

Unity API.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末攒岛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子胞锰,更是在濱河造成了極大的恐慌灾锯,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嗅榕,死亡現(xiàn)場(chǎng)離奇詭異顺饮,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)凌那,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)领突,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人案怯,你說(shuō)我怎么就攤上這事君旦。” “怎么了嘲碱?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵金砍,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我麦锯,道長(zhǎng)恕稠,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任扶欣,我火速辦了婚禮鹅巍,結(jié)果婚禮上千扶,老公的妹妹穿的比我還像新娘。我一直安慰自己骆捧,他們只是感情好澎羞,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著敛苇,像睡著了一般妆绞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上枫攀,一...
    開(kāi)封第一講書(shū)人閱讀 52,394評(píng)論 1 310
  • 那天括饶,我揣著相機(jī)與錄音,去河邊找鬼来涨。 笑死图焰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蹦掐。 我是一名探鬼主播技羔,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼笤闯!你這毒婦竟也來(lái)了堕阔?” 一聲冷哼從身側(cè)響起棍厂,我...
    開(kāi)封第一講書(shū)人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤颗味,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后牺弹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體浦马,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年张漂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了晶默。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡航攒,死狀恐怖磺陡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情漠畜,我是刑警寧澤币他,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站憔狞,受9級(jí)特大地震影響蝴悉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瘾敢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一拍冠、第九天 我趴在偏房一處隱蔽的房頂上張望尿这。 院中可真熱鬧,春花似錦庆杜、人聲如沸射众。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)责球。三九已至,卻和暖如春拓劝,著一層夾襖步出監(jiān)牢的瞬間雏逾,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工郑临, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留栖博,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓厢洞,卻偏偏與公主長(zhǎng)得像仇让,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子躺翻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

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