怎么用Unity實現(xiàn)掘地求升游戲

這篇文章主要介紹了怎么用Unity實現(xiàn)掘地求升游戲的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇怎么用Unity實現(xiàn)掘地求升游戲文章都會有所收獲,下面我們一起來看看吧。

創(chuàng)新互聯(lián)建站網(wǎng)站建設(shè)服務(wù)商,為中小企業(yè)提供成都網(wǎng)站建設(shè)、成都做網(wǎng)站服務(wù),網(wǎng)站設(shè)計,網(wǎng)站托管、服務(wù)器租用等一站式綜合服務(wù)型公司,專業(yè)打造企業(yè)形象網(wǎng)站,讓您在眾多競爭對手中脫穎而出創(chuàng)新互聯(lián)建站

實現(xiàn)方法

1.場景搭建

說干就干,我們來實際操作一下。

新建一個場景,用簡易的3D物體來組裝成猛男和錘子,掛上不同的材質(zhì)用顏色區(qū)分一下。

怎么用Unity實現(xiàn)掘地求升游戲

然后分別掛上Rigibody,因為我們想的是讓2D平面運行,因此在Rigibody上分別鎖了Z軸的移動和X,Y軸的旋轉(zhuǎn),順便把錘子上的重力去掉,因為待會要用代碼去控制錘子的位置。


2.控制錘頭

新建一個腳本掛載在父節(jié)點上,分別獲取身體和錘子。

我們想要的效果是錘子能一直跟隨鼠標(biāo)移動且錘頭一直指向鼠標(biāo),思路是在錘頭添加一個空的子節(jié)點作為錘頭的錨點,然后讓整個錘子圍繞著這個錨點的Z軸旋轉(zhuǎn)讓錘柄指向身體的方向。

public GameObject body;public GameObject hammer;Rigidbody body_rig;Rigidbody hammer_rig;Transform hammer_anchor;void Start(){
        body_rig = body.GetComponent<Rigidbody>();
        hammer_rig = hammer.GetComponent<Rigidbody>();
        hammer_anchor = hammer.transform.GetChild(2);}//物理相關(guān)的操作一般最好放在FixedUpdate里進行,與系統(tǒng)的物理計算保持同步
 private void FixedUpdate()
 {
        HammerControl();
 }void HammerControl(){
        //獲取鼠標(biāo)在屏幕上的坐標(biāo)并轉(zhuǎn)換為世界坐標(biāo)
        Vector2 MousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);

        //通過修改錘子身上剛體的速度讓錘子移動,向量的起點用錘頭的坐標(biāo)
        //注意這里要讓錘頭的錨點與錘子本身的坐標(biāo)的Z值相等,為了讓旋轉(zhuǎn)軸與世界坐標(biāo)的Z軸平行,同理鼠標(biāo)坐標(biāo)的Z值也直接使用錘子的坐標(biāo)的Z值
        hammer_rig.velocity = (new Vector3(MousePosition.x, MousePosition.y, hammer.transform.position.z) - hammer_anchor.position) * 10;

        //獲取身體到鼠標(biāo)的方向
        Vector3 direction = (new Vector3(MousePosition.x, MousePosition.y, hammer_anchor.position.z) - new Vector3(body.transform.position.x, body.transform.position.y, hammer_anchor.position.z)).normalized;

        //讓錘子沿著錘頭錨點轉(zhuǎn)向身體的方向
        hammer.transform.RotateAround(hammer_anchor.position, Vector3.Cross(hammer_anchor.up, direction), Vector3.Angle(hammer_anchor.up, direction));
 }

效果如圖:

怎么用Unity實現(xiàn)掘地求升游戲

但是現(xiàn)在問題來了,因為只是簡單模擬功能的效果,所以猛男并沒有手,但是最終我們是希望錘子活動的范圍離猛男有一個最大距離的限制,這樣看起來好像是有一只無形的手來操作錘子一樣,該如何計算這個范圍呢?

怎么用Unity實現(xiàn)掘地求升游戲


由圖可見這個問題的思路是,當(dāng)錘頭錨點在最大活動范圍里面時是跟著鼠標(biāo)的坐標(biāo)走,當(dāng)處于最大活動范圍外的時候是跟著錘頭錨點與身體坐標(biāo)的向量和最大移動范圍形成的圓的交點走。這個思路用于代碼上就是當(dāng)鼠標(biāo)移動到最大距離范圍之外時得到當(dāng)前身體到鼠標(biāo)位置的方向向量,然后讓這個向量的長度等于最大距離的長度。

那么,我們在此基礎(chǔ)上修改一下代碼。

 public float MaxDistance;
 float RelativeDistance;//單獨抽出一個函數(shù)獲取最大距離以外的轉(zhuǎn)換后的鼠標(biāo)坐標(biāo)
    Vector2 GetConfinedPosition(Vector2 mouseposition)
    {

        Vector2 Confined_MousePosition;

        //去掉body坐標(biāo)的Z值,避免計算距離時的影響
        Vector2 body_position = new Vector2(body.transform.position.x, body.transform.position.y);

        //計算當(dāng)前鼠標(biāo)位置和身體位置的相對距離
        RelativeDistance = Vector2.Distance(mouseposition, body_position);

        if (RelativeDistance > MaxDistance)
        {
            //當(dāng)相對距離大于自己設(shè)置的最大距離時,獲取轉(zhuǎn)換以后的目標(biāo)坐標(biāo)
            //這里的思路需要稍稍轉(zhuǎn)一個彎,一開始是獲取的是長度為最大距離,方向為身體到鼠標(biāo)方向的向量。
            //在這個基礎(chǔ)上加上身體的當(dāng)前坐標(biāo),其等于是將這個向量的起始點設(shè)置為身體的坐標(biāo)。
            //最后向量與坐標(biāo)點可以直接相互轉(zhuǎn)換,此時轉(zhuǎn)換后的目標(biāo)坐標(biāo)就等于這個向量。
            Confined_MousePosition = (mouseposition - body_position).normalized * MaxDistance + body_position;
        }
        else
        {
            //若相對距離小于最大距離那么鼠標(biāo)當(dāng)前坐標(biāo)就是目標(biāo)坐標(biāo)
            Confined_MousePosition = mouseposition;
        }     
        return Confined_MousePosition;
    }

然后把HammerControl()函數(shù)內(nèi)的MousePosition的賦值修改一下:

//獲取鼠標(biāo)在屏幕上的坐標(biāo)并轉(zhuǎn)換為世界坐標(biāo),若相對距離大于最大距離則獲得轉(zhuǎn)換后的坐標(biāo)
Vector2 MousePosition = GetConfinedPosition(Camera.main.ScreenToWorldPoint(Input.mousePosition));

最后調(diào)整MaxDistance到一個合適的值,效果如下:

怎么用Unity實現(xiàn)掘地求升游戲


3.控制身體的逆向運動

現(xiàn)在離實現(xiàn)就差最后一步了,前面思考實現(xiàn)方式的時候說過,錘頭的移動方向與理論上身體移動的方向剛好是相反的,并且同為以身體重心為原點,錘子的最大移動距離為半徑的圓的切線。那么我們順著這個思路去做。

首先還有一個先決條件,錘子不能憑空受力,必須是杵在地上或者掛在障礙物上才行。

我們先在錘頭上加一個碰撞盒子并在錘子上添加一個新建腳本,用幾句簡單的代碼用來檢測錘頭是否碰撞到東西。

public class CollisionDetection : MonoBehaviour
{
    public bool IsCollision;

    private void OnCollisionEnter(Collision collision)
    {
        IsCollision = true;
    }
    private void OnCollisionExit(Collision collision)
    {
        IsCollision = false;
    }
}

這里要注意的是錘子是錘頭的父物體,所以即便碰撞盒子不在錘子上,作為父物體的錘子依然能檢測到子物體上的碰撞信息,反過來由于錘頭上并沒有剛體組件,所以腳本掛在錘頭上是檢測不到碰撞信息的。

然后當(dāng)檢測到碰撞時給予身體一個相反的速度值。

void HammerControl()
{

  //在給hammer_rig.velocity賦值后添加下面的代碼
  if(hammer.GetComponent<CollisionDetection>().IsCollision)
        {
            BodyControl(hammer_rig.velocity);
        }
}

void BodyControl(Vector3 velociy)
 {
    body_rig.velocity = -velociy;   
 }

最后效果如下:

怎么用Unity實現(xiàn)掘地求升游戲

關(guān)于“怎么用Unity實現(xiàn)掘地求升游戲”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“怎么用Unity實現(xiàn)掘地求升游戲”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)頁題目:怎么用Unity實現(xiàn)掘地求升游戲
URL分享:http://bm7419.com/article40/ipooho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、商城網(wǎng)站、網(wǎng)站改版搜索引擎優(yōu)化、小程序開發(fā)、網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

營銷型網(wǎng)站建設(shè)