本節(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