最近在做一個簡單的FPS游戲,可以用鼠標控制槍口的指向,但是動畫的槍口沒有向上抬和向下抬
這樣問題就來了食听,槍口的水平位置我們控制模型的朝向就可以邻寿,但是在控制槍口上下抬得時候我們要怎么解決呢,剛開始想這用Mask遮罩涮雷,然并卵阵面。后來發(fā)現(xiàn)Animation是在Update中渲染的,那我就在LateUpdate中去修改槍口的朝向洪鸭,就是上半身向上样刷,或者向下。
void LateUpdate()
{
rotationZ += Input.GetAxis("Mouse Y") * 10f;
//這個是限制他的旋轉(zhuǎn)角度的
rotationZ = Mathf.Clamp(rotationZ, MinRotationZ, MaxRotationZ);
gunForward.localEulerAngles = new Vector3(gunForward.localEulerAngles.x, gunForward.localEulerAngles.y, rotationZ);
}
這樣就可以去控制他的旋轉(zhuǎn)方向
在上邊的方法大家注意到我是修改的他的localEulerAngles這個屬性览爵,這個屬性跟我們 Inspector面板中的那個是rotation的那個是一樣的置鼻。
我還用了第二種方法
但是用這種方法有一個問題就是,當我們槍口改變方向以后拾枣,又會立即回到初識點位置
這個是因為沃疮,每次在Update中渲染動畫的時候盒让,會把他的位置按照動畫骨骼系統(tǒng)去初始化,而當我們鼠標不動的時候司蔬,旋轉(zhuǎn)角度就為0邑茄,所以就回到了原來的點位,而第一種修改localEulerAngles卻沒有這種情況是因為我們我們的rotationZ的這個變量是可以存儲值的俊啼,所以在LateUpdate再修改一次localEulerAngles肺缕,這樣我們看著就是我們鼠標不動他的槍口也不動,而內(nèi)部是渲染了兩次他的模型的授帕。此時我們只需要一個空物體就可以解決
然而這個我們只需要把想要改變旋轉(zhuǎn)方向的物體放到空物體下邊同木,注意這兩個要在同一層級transform的屬性都要一樣,最最重要的一點跛十,不能在Hierarchy中直接拖彤路,要用代碼去控制,假如要是直接拖動畫會出問題芥映,至于為什么洲尊,這個我咨詢了下大神,大神說應(yīng)該是在我們準備啟動游戲的時候奈偏,系統(tǒng)會遍歷他的骨骼系統(tǒng)坞嘀,并存儲,我們在代碼中去修改的時候惊来,就不會對他的動畫產(chǎn)生影響而是會影響他的旋轉(zhuǎn)角度
這個我是在Awake中去修改的丽涩,這樣就可以了,大家可以去測試下裁蚁。而第二種方法矢渊,我們的那個修改旋轉(zhuǎn)角度的代碼也可以放Update里邊,但是第一種方法的修改方式必須放在LateUptade里邊枉证。
而限制他的旋轉(zhuǎn)角度昆淡,我們可以通過
localEulerAngles的屬性去限制,我的這個動畫是以Z軸旋轉(zhuǎn)的
float mouseY = Input.GetAxis("Mouse Y");
if (TestGun.localEulerAngles.z<=350f&& TestGun.localEulerAngles.z>=310f)
{
if (TestGun.localEulerAngles.z<=320f) {
mouseY = Mathf.Clamp(Input.GetAxis("Mouse Y"), 0, 1);
}
}
if (TestGun.localEulerAngles.z <= 30f && TestGun.localEulerAngles.z >= 10f) {
if (TestGun.localEulerAngles.z >= 20f)
{
mouseY = Mathf.Clamp(Input.GetAxis("Mouse Y"),-1, 0);
}
}
TestGun.transform.RotateAround(TestGun.position, TestGun.forward, mouseY);