広告あり

Unityで衝突させる(Collider)

Unity

こんにちは、ちきなるです。

今回は、Collider(コライダー)についてまとめていきます。主に、2Dを中心にまとめます。

いつも通り、私が使っていることを中心にまとめていくので、抜けなどはご了承ください。

Colliderの使い方を中心にまとめるので、大きさやサイズ、処理速度などは他の方のサイトを参考にしてみてください。

Colliderって?

簡単に言うと当たり判定です。

Colliderをオブジェクトに付けるとColliderの大きさに合わせてオブジェクト同士がぶつかります。

Collider同士がぶつかるので、片方にColliderが付いていなければ、ぶつかりません。

後で書きますが、Is Trrigerを設定してもぶつかりません。

地面を作り、キャラクターを作っても、そのままではキャラクターが地面をすり抜けていきます。

キャラクターと地面を衝突させる必要があるので、キャラクターと地面のオブジェクトにColliderを設定し、衝突を発生させれば、キャラクターが地面に立つことができます。

2Dと3Dについて

Colliderを使う時、一番に気を付けなければいけないことは、

2Dか3Dか

ということです。

ここを間違えると、衝突しません。

私自身、未だに間違えて、Colliderを付けているのに地面をすり抜けて焦ります。

自分が作っているゲームが2Dか3Dか確認し、

2Dなら2DのColliderを使う。
Add Component→Physics 2Dから選択

3Dなら通常のColliderを使う。
Add Component→Physicsから選択

3D Objectからオブジェクト(CubeやSphere) を作成するとデフォルトで3DのColliderが付いてくるので、2Dゲームで使う時は2DのColliderに付け替えましょう。

Colliderを付ける

さっそくColliderを付けてみます。
※2Dゲームで説明をしていきます。

オブジェクトを選択→Inspectorビュー→Add Component→Physics 2D→Colliderを選択。

Colliderにはいくつか種類があります。今回はさっくり説明します。

Box Collider 2D:四角

Capsule Collider 2D:カプセル

Circle Collider 2D:丸

Composite Collider 2D:Colliderの結合?良くわかりません。

Edge Collider 2D:線。カクカクした線。

Polygon Collider 2D:多角形。色々成型できます。

その他3D用のColliderがいくつかあります。

オブジェクトの形に合わせて選択しましょう。Colliderはシンプルな形の方が処理が速くなるようです。

Colliderの設定


Colliderには、いくつか設定項目があります。上から順に説明していきます。

Edit Collider

Box Collider 2Dを参考に説明していきます。
Colliderの形を手動で変更できます。左にあるボタンをクリックするとSceneビューで、Colliderの形を変えることができます。
四角をクリックしながらマウスを動かすと伸び縮みします。
※頂点数が変更できるColliderの場合、クリックしながらDeleteキーで頂点を削除できます。( PolygonとかEdge)

Material

作成したPhysics Material 2Dを設定できます。
ツールバーのAssets→Create→Physics Material 2D

PhysicsMaterial 2Dでは、摩擦やぶつかった時の弾力などを設定できます。


Is Trigger

ColliderをTriggerにするかどうかのチェックボックス。

チェックすると、ColliderがTriggerになります。

TriggerにするとCollider同士がすり抜けるようになります。どちらか片方のColliderがTriggerになっていると、すり抜けます。

その代り、Trrigerの中に別のColliderが進入した時、出た時、中に入っている時に、コールバック(スクリプトでの呼び出し)が発生します。

OnTriggerEnter2D, OnTriggerExit2D, OnTriggerStay2D

 

Used By Effector

オブジェクトに設定されているEffectorを有効にするかどうか。

使ったことが無いので詳しくはわかりませんが、

オブジェクトにEffectorを設定し、衝突などが発生した時にEffectorで設定された動作を行うようです。

Effectorは色々あるようなので、面白い動きが実現できるかも?

Add Component→Physics 2D の中にある〇〇Effector 2Dを設定するようです。

 

Used By Composite

Composite Collider 2Dに含めるかどうかのチェックボックス?

これまた使ったことが無いのでわかりません。

多分Composite Collider 2Dで一纏めにするColliderを設定するチェックボックスだと思います。

 

Auto Tiling

これまた良くわかりませんが、説明を見る限り

Sprite RendererのDraw ModeをTiledにするとチェックする必要があるようです。

ちなみにTiled(タイルド)はタイル張りの様にSpriteを連続して並べるモードです。

 

Offset

簡単に言うと、Colliderを中心からどれだけずらすかの値。

x方向 y方向それぞれどれだけずらすか設定できます。

Edit Colliderで手動で調整するなら気にしなくていい所。

 

Size

簡単に言うと、Colliderのサイズ。

x方向 y方向それぞれのサイズを設定できます。

Edit Colliderで手動で調整するなら気にしなくていい所。

Offset, Sizeを変更しすぎて元に戻したい時は、
一番上にあるBox Collider 2Dで右クリックを押しResetを押すと初期状態に戻ります。ただし、Collider 2Dに設定したその他の設定も初期化されるので注意。

失敗した時は、キーボードのCtrl+zで一つ戻せます。Ctrl+yで進めます。

 

コールバックについて

Colliderは特定のタイミングで、呼び出されるメソッドがあります。

簡単に言うと、今ぶつかったよ、などのタイミングをスクリプトに教えてくれます。

Enter2D:ぶつかった時(進入した時)
Exit2D :離れた時(出た時)
Stay2D  :当たっている時(中にいる時)

※( )内はTriggerの時の条件になります。

の3つがあり、IsTriggerがOnかOffで前に付く単語が変わります。

IsTrigger OffIsTrigger On
Enter2DOnCollisionEnter2D OnTriggerEnter2D
Exit2DOnCollisionExit2DOnTriggerExit2D
Stay2DOnCollisionStay2D  OnTriggerStay2D

IsTriggerOffの時は、 OnCollision がついて

OnCollisionEnter2D
OnCollisionExit2D
OnCollisionStay2D

IsTriggerOnの時は、OnTriggerがついて

OnTriggerEnter2D
OnTriggerExit2D
OnTriggerStay2

になります。

補足:Enter2DとExit2Dはそれぞれ条件を満たすと1度呼ばれます。Stay2Dだけ条件を満たしている間毎フレーム呼ばれます。

呼び出されるメソッド

ColliderのIsTriggerのOn Offで呼び出されるメソッドが変わります。

ColliderTrigger
Collider OnCollisionOnTrigger
Trigger OnTrigger OnTrigger

自信か相手、どちらかのIsTriggerがOnになっているとOnTriggerが呼ばれます。
※自身のIsTriggerがOffでも相手のIsTriggerがOnならOnTriggerが呼ばれます。

IsTriggerが両方ともにOffの時だけOnCollisionが呼ばれます。

スクリプトでの使い方

オブジェクトにスクリプトを設定し、設定したスクリプト内で

private void OnCollisionEnter2D(Collision2D collision)
{
       //処理
}

上の様に記述します。

OnCollisionEnter2D以外のメソッドもOnCollisionEnter2Dの部分を書き換えれば同様に使えます。

簡単な使い方

ここでは、私が良く使う方法を簡単に書いていきます。

1.ぶつかった相手のタグで処理を分ける。

private void OnCollisionEnter2D(Collision2D collision)
{
       if(collision.gameObject.tag == "〇〇〇")
       {
             //処理
       }
}

引数になっているcollisionにはぶつかった相手の情報などが入っています。

上記は、ぶつかったCollisionが設定されているオブジェクトのタグを見て処理をするかどうか判定しています。

2.自信の特定部位にぶつかった時

private void OnCollisionEnter2D(Collision2D collision)
{
       if(collision.otherCollider.tag == "〇〇〇")
       {
             //処理
       }
}

collisionのotherColliderには、ぶつかった自身のColliderの情報が入っています。

オブジェクトに子のオブジェクトを付けてタグで分けておくとぶつかった時に、otherColliderでどこにぶつかったのか知ることができます。

色んな使い方ができるので、色々試してみてください。

Unityのスクリプトリファレンス

Collider

Collider2D

コメント

  1. […] Collider – 衝突させる | 元 SE のニートがゲーム開発者を目指す […]

'}},vars:{discoveredBrushes:null,highlighters:{}},brushes:{},regexLib:{multiLineCComments:XRegExp("/\\*.*?\\*/","gs"),singleLineCComments:/\/\/.*$/gm,singleLinePerlComments:/#.*$/gm,doubleQuotedString:/"([^\\"\n]|\\.)*"/g,singleQuotedString:/'([^\\'\n]|\\.)*'/g,multiLineDoubleQuotedString:XRegExp('"([^\\\\"]|\\\\.)*"',"gs"),multiLineSingleQuotedString:XRegExp("'([^\\\\']|\\\\.)*'","gs"),xmlComments:XRegExp("(<|<)!--.*?--(>|>)","gs"),url:/https?:\/\/[\w-.\/?%&=:@;#]*/g,phpScriptTags:{left:/(<|<)\?(?:=|php)?/g,right:/\?(>|>)/g,eof:!0},aspScriptTags:{left:/(<|<)%=?/g,right:/%(>|>)/g},scriptScriptTags:{left:/(<|<)\s*script.*?(>|>)/gi,right:/(<|<)\/\s*script\s*(>|>)/gi}},toolbar:{getHtml:function(e){function t(e,t){return B.toolbar.getButtonHtml(e,t,B.config.strings[t])}for(var n='
',r=B.toolbar.items,i=r.list,a=0,l=i.length;l>a;a++)n+=(r[i[a]].getHtml||t)(e,i[a]);return n+=""},getButtonHtml:function(t,n,r){return n=e(n),''+e(r)+""},handler:function(e){function t(e){var t=RegExp(e+"_(\\w+)"),n=t.exec(r);return n?n[1]:null}var n=e.target,r=n.className||"",i=s(g(n,".syntaxhighlighter").id),a=t("command");i&&a&&B.toolbar.items[a].execute(i),e.preventDefault()},items:{list:["expandSource","help"],expandSource:{getHtml:function(e){if(1!=e.getParam("collapse"))return"";var t=e.getParam("title");return B.toolbar.getButtonHtml(e,"expandSource",t?t:B.config.strings.expandSource)},execute:function(e){var t=o(e.id);r(t,"collapsed")}},help:{execute:function(){var e=x("","_blank",500,250,"scrollbars=0"),t=e.document;t.write(B.config.strings.aboutDialog),t.close(),e.focus()}}}},findElements:function(e,t){var n=t?[t]:i(document.getElementsByTagName(B.config.tagName)),r=B.config,a=[];if(r.useScriptTags&&(n=n.concat(A())),0===n.length)return a;for(var l=0,s=n.length;s>l;l++){var o={target:n[l],params:p(e,E(n[l].className))};null!=o.params.brush&&a.push(o)}return a},highlight:function(e,t){var n=this.findElements(e,t),r="innerHTML",i=null,a=B.config;if(0!==n.length)for(var l=0,s=n.length;s>l;l++){var o,t=n[l],u=t.target,c=t.params,g=c.brush;if(null!=g){if("true"==c["html-script"]||1==B.defaults["html-script"])i=new B.HtmlScript(g),g="htmlscript";else{var h=b(g);if(!h)continue;i=new h}o=u[r],a.useScriptTags&&(o=M(o)),""!=(u.title||"")&&(c.title=u.title),c.brush=g,i.init(c),t=i.getDiv(o),""!=(u.id||"")&&(t.id=u.id),u.parentNode.replaceChild(t,u)}}},all:function(e){m(window,"load",function(){B.highlight(e)})}};return B.Match=function(e,t,n){this.value=e,this.index=t,this.length=e.length,this.css=n,this.brushName=null},B.Match.prototype.toString=function(){return this.value},B.HtmlScript=function(e){function t(e,t){for(var n=0,r=e.length;r>n;n++)e[n].index+=t}function n(e){for(var n,a=e.code,l=[],s=r.regexList,o=e.index+e.left.length,u=r.htmlScript,c=0,g=s.length;g>c;c++)n=L(a,s[c]),t(n,o),l=l.concat(n);null!=u.left&&null!=e.left&&(n=L(e.left,u.left),t(n,e.index),l=l.concat(n)),null!=u.right&&null!=e.right&&(n=L(e.right,u.right),t(n,e.index+e[0].lastIndexOf(e.right)),l=l.concat(n));for(var h=0,g=l.length;g>h;h++)l[h].brushName=i.brushName;return l}var r,i=b(e),a=new B.brushes.Xml,l=this,s="getDiv getHtml init".split(" ");if(null!=i){r=new i;for(var o=0,u=s.length;u>o;o++)(function(){var e=s[o];l[e]=function(){return a[e].apply(a,arguments)}})();return null==r.htmlScript?(v(B.config.strings.brushNotHtmlScript+e),void 0):(a.regexList.push({regex:r.htmlScript.code,func:n}),void 0)}},B.Highlighter=function(){},B.Highlighter.prototype={getParam:function(e,t){var n=this.params[e];return d(null==n?t:n)},create:function(e){return document.createElement(e)},findMatches:function(e,t){var n=[];if(null!=e)for(var r=0,i=e.length;i>r;r++)"object"==typeof e[r]&&(n=n.concat(L(t,e[r])));return this.removeNestedMatches(n.sort(k))},removeNestedMatches:function(e){for(var t=0,n=e.length;n>t;t++)if(null!==e[t])for(var r=e[t],i=r.index+r.length,a=t+1,n=e.length;n>a&&null!==e[t];a++){var l=e[a];if(null!==l){if(l.index>i)break;l.index==r.index&&l.length>r.length?e[t]=null:l.index>=r.index&&i>l.index&&(e[a]=null)}}return e},figureOutLineNumbers:function(e){var t=[],n=parseInt(this.getParam("first-line"));return y(e,function(e,r){t.push(r+n)}),t},isLineHighlighted:function(e){var t=this.getParam("highlight",[]);return"object"!=typeof t&&null==t.push&&(t=[t]),-1!=h(t,""+e)},getLineHtml:function(e,t,n){var r=["line","number"+t,"index"+e,"alt"+(""+(0==t%2?1:2))];return this.isLineHighlighted(t)&&r.push("highlighted"),0==t&&r.push("break"),'
'+n+""},getLineNumbersHtml:function(e,t){var n="",r=a(e).length,i=parseInt(this.getParam("first-line")),l=this.getParam("pad-line-numbers");1==l?l=(""+(i+r-1)).length:1==isNaN(l)&&(l=0);for(var s=0;r>s;s++){var o=t?t[s]:i+s,e=0==o?B.config.space:S(o,l);n+=this.getLineHtml(s,o,e)}return n},getCodeLinesHtml:function(e,t){e=C(e);for(var n=a(e),r=(this.getParam("pad-line-numbers"),parseInt(this.getParam("first-line"))),e="",i=this.getParam("brush"),l=0,s=n.length;s>l;l++){var o=n[l],u=/^( |\s)+/.exec(o),c=null,g=t?t[l]:r+l;null!=u&&(c=""+u[0],o=o.substr(c.length),c=c.replace(" ",B.config.space)),o=C(o),0==o.length&&(o=B.config.space),e+=this.getLineHtml(l,g,(null!=c?''+c+"":"")+o)}return e},getTitleHtml:function(t){return t?""+e(t)+"":""},getMatchesHtml:function(e,t){function n(e){var t=e?e.brushName||a:a;return t?t+" ":""}for(var r=0,i="",a=this.getParam("brush",""),l=0,s=t.length;s>l;l++){var o,u=t[l];null!==u&&0!==u.length&&(o=n(u),i+=N(e.substr(r,u.index-r),o+"plain")+N(u.value,o+u.css),r=u.index+u.length+(u.offset||0))}return i+=N(e.substr(r),n()+"plain")},getHtml:function(t){var n,r,i,a="",s=["syntaxhighlighter"];return 1==this.getParam("light")&&(this.params.toolbar=this.params.gutter=!1),className="syntaxhighlighter",1==this.getParam("collapse")&&s.push("collapsed"),0==(gutter=this.getParam("gutter"))&&s.push("nogutter"),s.push(this.getParam("class-name")),s.push(this.getParam("brush")),t=w(t).replace(/\r/g," "),n=this.getParam("tab-size"),t=1==this.getParam("smart-tabs")?R(t,n):H(t,n),this.getParam("unindent")&&(t=P(t)),gutter&&(i=this.figureOutLineNumbers(t)),r=this.findMatches(this.regexList,t),a=this.getMatchesHtml(t,r),a=this.getCodeLinesHtml(a,i),this.getParam("auto-links")&&(a=I(a)),"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.match(/MSIE/)&&s.push("ie"),a='
'+(this.getParam("toolbar")?B.toolbar.getHtml(this):"")+''+this.getTitleHtml(this.getParam("title"))+""+""+(gutter?'
'+this.getLineNumbersHtml(t)+"":"")+''+'
'+a+""+""+""+""+""+""},getDiv:function(e){null===e&&(e=""),this.code=e;var t=this.create("div");return t.innerHTML=this.getHtml(e),this.getParam("toolbar")&&m(c(t,".toolbar"),"click",B.toolbar.handler),this.getParam("quick-code")&&m(c(t,".code"),"dblclick",X),t},init:function(e){this.id=f(),u(this),this.params=p(B.defaults,e||{}),1==this.getParam("light")&&(this.params.toolbar=this.params.gutter=!1)},getKeywords:function(e){return e=e.replace(/^\s+|\s+$/g,"").replace(/\s+/g,"|"),"\\b(?:"+e+")\\b"},forHtmlScript:function(e){var t={end:e.right.source};e.eof&&(t.end="(?:(?:"+t.end+")|$)"),this.htmlScript={left:{regex:e.left,css:"script"},right:{regex:e.right,css:"script"},code:XRegExp("(?"+e.left.source+")"+"(?.*?)"+"(?"+t.end+")","sgi")}}},B}();"undefined"!=typeof exports?exports.SyntaxHighlighter=SyntaxHighlighter:null