【Unity】ピースの移動速度と衝突判定

ピースの移動処理を作ってみましたが、 操作しているとおかしな事が起きたので、まとめてみます。 現段階で移動スピードを15にしていたのですが、 動きが遅く感じたので、30くらいに上げてみた所、 難点が出始めました。 まず、ピースが二つ程度なら問題なかったのですが、 ピースを3つにして操作してみたところ… 3つ目のピースが変な位置で停止するようになりました。 恐れていた位置補正spanから外れて停止した状態です。 ピースを4つにするとどうなるか… 前のピースに潜り込んでしまいました(ノ_<。)うっうっうっ 衝突判定がでる間にピースが進んでしまい、 spanから外れる、又は、時点の座標を読んでそちらへ移動するといった状況です。 なぜ、こんな事が起こるか考えてみました。 緑の縁がコラインダーです。 問題が起きたのがこの配列なんですが、 これで上に移動すると最初の写真のようになりました。 スピードは30です。 実際に早くて目視はできないので、 移動処理をImageで捉えるとこんな感じになっているのではと思います。 スピードが速すぎて衝突判定で処理が行われてる間に これくらい隣あったコラインダーが入り込んでるのでは?と 推測できます。 これでは、スピードを上げる事が出来ません。 また、ピースが最大の4つ並んでいる状態で 速度を15に落としても 一番後ろにあるピースは、これだけ動く事になりま…

続きを読む

ブログを書いていて思う事

2048の作成を始めて、知識が足りない事が多くて 困っております。 毎日、Google先生と勉強会を開いているのですが、 検索が下手なせいで、なかなか目的の情報に辿り着きません。(ノ_<。)うっうっうっ 心優しいメンターが現れないかと夢みています。(* v v)。ハズカシイ 独学でやって行くのは、非常に心が折れやすいのですが、 そんな中続けていけてるのは、ブログのおかげとも言えます。 ブログを書くメリットは、 ・ブログに挙げる事で続きを作る必要がある ・一度、頭に入れた情報が書く事によって理解が深まる ・間違いなどを調べて正しい情報を収集できる などなど ここまで、続けてこれたのはブログのおかげですね~ ただ、勉強が進まないとブログを書くネタも無くなるのが難点でっす。(^.^) オホホホ ブログを続けて嬉しい事もあります。 こんな超初心者のブログでも読んでくれる人がいる事です。 始めた頃は、”こんなブログ読む人いるかな?”って感じでした。 ネットの隅で細々と書いてるブログなんで、見付けてくれる人がいるかどうか… でも今では、毎日数人の方が目を通してくれてます。 誰も見ないブログなら止めていた気がします。 これからも読んでくれる人がいる事を励みに書いて行こうと思います。 最後に、 なんでも良いんでコメントを頂けると嬉しいです。 ダメ出し、励まし、なんでもいいです。 全然、関係ない…

続きを読む

【Unity】ピースのポジションを配列で管理する

2019/10/2追記 2019/10/9追記2 配列から2次元配列変換 ここまで、ピースの移動処理を作ってきたのですが、 前回挙げた問題点は、克服できておりません。 ただ、予期せぬ衝突判定と所定範囲外にピースが出るについては 処理速度などで変わるので、どうしようもない部分です。 なので、このままで行こうと思います。 動作中のフリック入力については、 動いている間、入力を受け付けないくらいしか 思いついてないですね~ ( ̄~ ̄;) ウーン この部分は、今後の課題として置いておきます。 前回のCollisionで一つ修正する部分ができたので触れておきます。 二つのピースが衝突する際、Collisionが呼び出されるのですが、 先行しているピースは、既に停止しており位置調整も終わってます。 先行ピースのCollisionが働くと再度、位置調整を行う事になるので、 無駄となります。 なので、Collision内容に修正を加えました。 追加した内容は、 Updateの最初に if(Move){Return;} これは、ピースが移動中ならフリックの入力を受け付け ないようにするためです。 OnCollisionEnter2Dの最初に if(Move==false){Return;} 停止中のCollisionは受け付けないようにしました。 これだけです。(;^o^) \(ToT )あんたほん…

続きを読む

【Unity】Rigidbodyの挙動を止めた衝突判定

前回、Mathfを使った範囲設定をしました。 ただ、複数ピースの場合、 後ろから来るピースが範囲内で止まったピースを 押し込んでしまう為、結局は範囲外に押し出されてしまいます。 ピース同士の物理挙動が働く為なのですが このままでは、ダメなので物理挙動を無くします。 物理挙動を無くす為にRigidbodyの設定を変えます。 今の設定を見るとボディタイプが動的になっています。 これは物理挙動を計算するモードです。 なので、 運動学的に設定して、Kinematicにチェックを入れます。 これで、ピース同士が重なってもすり抜けるので ピースの押し込みが回避できます。 少しKinematicに触れておくと 静力学statics 動力学dynamics 力をもち出さない場合を運動学kinematics と分類されるそうです。 Unityではボディタイプを選択できるので、 物理挙動を必要とする場合、動的【Dynamic】 固定する場合、静的【Static】 物理挙動を必要としないが動かす必要がある場合、運動学的【Kinematic】 場面で使い分けるといいようです。 更に、スクリプトから完全に操作する場合、 完全なるキネマティックコンタクトにチェックを入れておけば 問題ないかと思います。 kinematicの説明が終わった所で、 全てのピースに設定を反映します。 これで押し込みは無…

続きを読む

【Unity】Mathf.Clampを使って移動範囲を制限する

2019/9/17 追記 前回、物理挙動を使ってピースの動きを止めていたのですが、 限界がありそうです。 少し路線を変更して、 transform挙動を直接操作する形を試してみます。 まず、外壁の接触判定に頼っていた部分を修正していきます。 調べるとMathf.Clampと言うクラスがあるそうで、 勉強してみようと思います。 Mathfとは、Math(数学)とfloat型を組み合わせたクラスだそうで、 Mathf.○○で、○○の形で計算してくれる関数なんだそうです。 今回、使うのはMathf.Clampは、 数値を関数に入力した際、上下限の値から外れないように値を返す 関数となります。 書き方は Mathf.Clamp(数値,下限値,上限値)となります。 例えば float x; x=mathf.Clamp(1,0,10); 入力した数値が1で、下限は0、上限は10 xに入る数値は1となります。 上下限を超えない場合は、そのままの数値が返され 範囲を超えた場合、上下限の数値が返ってきます。 x=mathf.Clamp(-1,0,10); なら、xは0となります。 早速、導入でっす。 まず、移動範囲の上下限を設定するため 変数を用意します。 続いて、FixedUpdate内に移動処理を書いていましたが、 コードが長くなるので、新たにPieceMoveメソッドを作り こちら…

続きを読む