###何ができるか
ロープが作れます。ゆらゆらゆれて、つかんだり、切ったり。
HingeJointで1から作成する必要がありません。
スパイダーマン!みたいなものとかも作れそう・・・と思ったので・・・作ってみました
サンプルのシーンが3つと、Script、ドキュメントなどが入っています
固定でロープなどをシーン上に配置する場合は
Window->2D RopeSystemのメニューから出るウィンドウから作成できます
今回はScriptでロープを作成するのでウィンドウでの作成方法は割愛
Rope Test3のSceneが動的にロープを作成するサンプルです。
これを参考に・・・
RuntimeRope.csのソースの必要な所をコピーして修正していきました。
クリックした位置にオブジェクトがあればそこにロープをつなぎ、既につないでいればロープを離すという処理にしています。
3Dの空間を飛び回りたかったのでカメラをPerspectiveに、しかしながら建物などのコリダーは2Dでやっております。
###クリック判定部分
ここが一番苦労したところ。奥行きのあるカメラに2Dのコリダーのあたり判定をとるのに苦労しました。
DummyPointObjはクリックした位置においているCubeのオブジェクトです
その位置に向かってロープを作成します。
もう少しうまい書き方があるかも知れませんが・・・。
Ray ray = mainCameraTran.GetComponent<Camera>().ScreenPointToRay( Input.mousePosition );
RaycastHit2D hit2d = Physics2D.GetRayIntersection(ray);
if(hit2d.collider != null && hit2d.collider.gameObject.tag == "Object")
{
Vector3 mousePos = Input.mousePosition;
mousePos.z = distance;
dummyPointObj.position = mainCameraTran.GetComponent<Camera>().ScreenToWorldPoint( mousePos );
pointB = dummyPointObj.transform;
###ロープの切り離し
ロープを切り離すときはPlayerとつながった先のオブジェクトに作成されたDistanceJoint2Dを削除することで切り離せます
あとは一定時間たったあとにロープを削除しています
Destroy(transform.GetComponent<DistanceJoint2D>());
Destroy (dummyPointObj.GetComponent<DistanceJoint2D>());
Destroy(chainsHolder, 3f);
###ロープで加速
前方向にスィングしているときは加速するようにしました
簡単ではありますがロープの一番下のRigidbody2DのVelocityがプラスの時は値をふやしてあげることで思ったようなうごきになりました。
if(chainsHolder != null)
{
Rigidbody2D ropeRigid = chainsHolder.transform.FindChild("chain 1").GetComponent<Rigidbody2D>();
float dx = ropeRigid.velocity.x;
if(dx > 0)
{
dx *= 1.8f;
if(dx > 60f)
{
dx = 60f;
}
ropeRigid.AddForce(new Vector2(dx, 0));
}
else
{
dx *= 0.95f;
if(dx < 0f)
{
dx = 0f;
}
ropeRigid.AddForce(new Vector2(dx, 0));
}
}
###ロープのprefabの設定
ロープの動きはロープのprefabの主にHinge Joint 2Dのところで変更できます
###あたり判定の設定
ロープとキャラクターやキャラクーと建物などにあたり判定が発生しないようにLayer Collision Matrixで設定してあげました。
あとはキャラクターもラグドールとかジョイントでつくればいい感じのものができそうです。