LoginSignup
9
8

More than 5 years have passed since last update.

2D Rope Systemでロープアクション

Posted at

2D Rope System

スクリーンショット-2015-08-30-01.05.07.png

何ができるか

ロープが作れます。ゆらゆらゆれて、つかんだり、切ったり。
HingeJointで1から作成する必要がありません。
スパイダーマン!みたいなものとかも作れそう・・・と思ったので・・・作ってみました

アセットをインポート

サンプルのシーンが3つと、Script、ドキュメントなどが入っています
固定でロープなどをシーン上に配置する場合は
Window->2D RopeSystemのメニューから出るウィンドウから作成できます

今回はScriptでロープを作成するのでウィンドウでの作成方法は割愛

こんなの作ってみました

Play.gif

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で設定してあげました。

あとはキャラクターもラグドールとかジョイントでつくればいい感じのものができそうです。

9
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
8