1. 程式人生 > >【unity 3D】關於unity中製作繩子(Rope)的總結

【unity 3D】關於unity中製作繩子(Rope)的總結

    這幾天因為專案需要,一直在搜尋和學習unity中關於繩子製作的資源。於是開始在CSDN、BaiDu、Bilibili上面找各種相關的資源,但是隻是講解了最基本的關於繩子的通用製作方法,即:繩子由若干個Gameobject(可以是Cube、Capusual、Cylinder etc.)拼接而成,而且每個Gameobject都添加了Hinge Joint(鉸鏈關節)元件,每個Gameobject的Hinge Joint元件中的Connection Body屬性都是它上面緊鄰的Gameobject的Rigibody元件。接下來,我先介紹一下這種普遍的方法。

普通方法:

    先在unity場景中構建一個空的GameObject並更名為:RopeParent。在RopeParent目錄下新增若干個Cube。

       接下來,我們在RopeParent上新建一個名為rope的指令碼。

 

         這個指令碼的內容是:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class rope : MonoBehaviour {

    //儲存RopeParent的Rigibody元件
    internal Rigidbody RBody;
	// Use this for initialization
	internal void Start () {
        //給RopeParent新增Rigibody元件
        this.gameObject.AddComponent<Rigidbody>();
        //獲取RopeParent的Rigibody元件並賦值給RBody
        this.RBody = this.gameObject.GetComponent<Rigidbody>();
        this.RBody.isKinematic = true;
        //RopeParent中子物體的數量
        //給每一個子物體都加上Hinge Joint元件
        int childcount = this.transform.childCount;
        for (int i = 0; i < childcount;i++) {
            Transform t = this.transform.GetChild(i);
            t.gameObject.AddComponent<HingeJoint>();

            HingeJoint hinge = t.gameObject.GetComponent<HingeJoint>();
            hinge.connectedBody = i == 0 ? this.RBody : this.transform.GetChild(i - 1).GetComponent<Rigidbody>();
            hinge.useSpring = true;
            hinge.enableCollision = true;
        }
	}	
}

    最後製作出來的結果是:如果你去撥動繩子,它會繞著一個點旋轉。

   可是自己的專案需要這根繩子去跟隨著其他的物體一起移動,但是上面的辦法就不能夠達到這樣的效果。So。。。。經過漫長的嘗試未果,決定翻牆。最後在Youtobe上找到了類似的教程。現在把方法總結如下:

   首先,Cube是用來模擬專案中繩子跟隨移動的物件,每個Capsule都是繩子的每一個小結。

 

每個Capsule都有Character Joint元件, 而且元件上的Enable Projection的對勾要打上。每個Capsule上都有Rope指令碼。

Rope指令碼程式碼如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Rope : MonoBehaviour {

	// Use this for initialization
	void Start () {
        gameObject.GetComponent<CharacterJoint>().connectedBody = gameObject.transform.parent.GetComponent<Rigidbody>();
	}
}

程式碼就是把當前繫結的Capsule的Character Joint元件的Connection Body設定成它的父部件的Rigibody。

這樣一來上方立方體的移動也會帶動繩子的移動。

效果是基本達到了,可是我現在還是一直不明白為什麼綁定了Hinge Joint的物體只能繞某一個固定的點旋轉而不能跟隨父部件一起移動。希望走過路過的大神們能夠幫我解答疑惑。