code ソーシャル

Unityアプリcodetips(8)

スポンサーリンク

//tips

//Physicsを使った当たり判定

Physicsを使った当たり判定は2種類あり、衝突Collisionモードとすり抜けTriggerモードがある。

Collisionモードはオブジェクト同士の衝突を感知するだけでなく、跳ね返りなどの衝突応答も行う。

Triggerモードは衝突の感知を行い、衝突応答は実行されない。

・衝突した瞬間 OnCollisionEnter,OnTriggerEnter
・衝突している最中 OnCollisionStay,OnTriggerStay
・衝突が終わった瞬間 OnCollisionExit,OnTriggerExit

2つのオブジェクトの衝突後や接触中にアクションを行いたい場合は、双方のオブジェクトにColliderとRigidbodyをアタッチする必要があったが、当たり判定だけであれば、Colliderを両方のオブジェクトにアタッチし、Rgidbodyは片方のオブジェクトだけで良い。

プレイヤと旗の判定を作るには、旗にColliderをアタッチしてIs Triggerをチェックし、Triggerモードを設定し、プレイヤコントローラにOnTriggerEnterを実装する。

PlayerControllerの中に

void OnTriggerEnter2D(Collider2D other)
{
Debug.Log(”ゴール”);
}

//ゴールシーンへの遷移

Unityはゲームの場面をシーンという括りで管理し、通常TitleScene,MenueScene,GameScene,GameOverSceneなどの複数のシーンをつなぎ合わせて一つのゲームになっている。

シーンの遷移は遷移を行いたいタイミングで、シーンファイル名を指定することにより可能となる。

新しいシーンを作成するには、FileからNewSceneで作成でき、シーンのタイトルとなるClearSceneなどと名前をつけておくと管理しやすい。

クリアシーンからゲームシーンに遷移するためには監督スクリプトが必要となる。
シーンの遷移に使うLoadSceneメソッドを使用するためにSceneManagementの使用を宣言している。

このメソッドはLoadScene(“シーン名”)のような引数に与えたシーン名のシーンをロードするメソッドである。

using UnityEngine.SceneManagement;

public class ClearDirector : MonoBehaviour
{
void Update()
{
if(Input.GetMouseButtonDown(0))
{
SceneManager.LoadScene(“GameScene”);
}
}
}

この実装後にUnityのシーン登録を行う必要があり、登録を行っていないと、スクリプトが正しくてもエラーが出てしまう。

シーン登録は簡単でFileのBuild SettingsからScenes In Build欄に、プロジェクトウィンドウからClear SceneとGameSceneをドラッグアンドドロップする。

Scenes In Buildに追加したシーンの右側には、シーン番号が割り振られ、0,1と増えていく。0番のシーンからスタートするので順序を入れ替えたいときにはドラッグアンドドロップで修正する。

ゲームシーンからクリアシーンに遷移するためには、プレイヤがゴールの旗に触れた瞬間に遷移のスクリプトを実行すれば良い。

先と同じようにLoadSceneを使うために、
using UnityEngine.SceneManagement;
を追加し、PlayerControllerに下記を記載する。

void OnTriggerEnter2D(Collider2D other)
{
Debug.Log(“ゴール”);
SceneManager.LoadScene(“ClearScene”);
}

プレイヤが画面外に出てしまった時もゲームシーンの遷移読み込みが有効で、
if(transform.position.y < -10)
{
SceneManager.LoadScene(“GameScene”)
}
Y座標が10以下になり、画面の外に出た場合にゲーム初期状態に戻すなどができる。

//動きの条件制約を厳しくする

AddForceでキーを押すたびにジャンプできるように設定すると、地面に着地せず、永遠に空を飛び続けることが可能になる。

これを改善するために、制約を厳しくする。
if(Input.GetKeyDown(KeyCode.Space) && this.rigid2D.velocity.y == 0)
{
this.rigid2D.AddForce(transform.up * this.jumpForce);
}

このように条件を&&で追加し、現条件かつy方向の速度が0の時とすることで制約を厳しくしている。

//デバイス間の速度差をなくす

高性能PCは1秒間60回Updateメソッドが呼ばれるのに対して、スマホでは1秒間に20回程度しかUpdateメソッドが呼ばれないということがあり、AddForceを数値のままで設定してしまうと、デバイス間で速度差が生まれてしまうことになる。

このデバイス間の格差をなくすために、直前のフレームと今のフレーム間で経過した時間を返すTime.deltaTimeを使用し、移動速度を調整することで、1秒後の移動距離を揃える必要がある。

サンプルを下記に記載する。

public class Sample : MonoBehaviour
{
/// <summary>
/// 速度[m/s]
/// </summary>
private Vector3 _velocity = new Vector3(1, 0, 0);

void Update()
{
// position[m] = position[m] + (velocity[m/s] * time[s])
// [m] = [m] + [(m/s * s)]
// [m] = [m] + [m] ←両辺で単位が同じになった
transform.position = transform.position + (_velocity * Time.deltaTime);
}
}

https://qiita.com/toRisouP/items/930100e25e666494fcd6

//スマホの加速度センサの取得仕方

スマホの傾きでキーの入力と同じ動作をさせることができる加速度センサの使い方を記す。

加速度センサの値を取得するにはInputクラスのaccelerationを使用。基本的にはkeyの入力やMouseのクリックと変わらない。

if(Input.acceleration.x > this.threshold) key = 1;

thresholdは敷居、入り口、閾をさし、ここでは傾きにより入力が発生し始める境目を示している。

thresholdは変数で自分で設定できるものなので、先にfloat threshold=0.2f;などと設定しておく必要がある。

//Animation遷移の補足
「Walk」と「Jump」のアニメーションを遷移させたい場合を考える。

すでにAnimationClipとして「Walk」と「Jump」を作ってあるものとし、それらの関係をAnimationController上で設定する。

動かしたいオブジェクトのAnimationControllerを開くと、AnimationClipとして「Walk」と「Jump」、さらに「Entry」「Any State」「Exit」の計5つのボックス(ノード)が表示される。

初期状態ではEntryから一つのAnimationClipに対して矢印が向けられ遷移する状態となっている。

「Walk」に矢印が向けられていた場合、「Walk」と「Jump」を行き来させるために、Make Transitionで双方を矢印を繋ぐ。

「Jump」から「Walk」への遷移は、アニメーションが終わった時点で、自動的に行いたいため、矢印のインスペクターからHas Exit Timeにチェックを入れる。その下に表示されるSettingsをクリックし、詳細のExit Timeを1、Transition DureationとTransition Offsetを0に設定する。

Has Exit Timeはアニメーションの再生が終了した時点で、自動的に別のアニメーションに遷移するかを示したもの。

Exit Timeはアニメーションの終了時間を設定するもので、Exit Time が 1 より大きい場合は、決まった回数のループを行った後、特定の時点で終了することができる。例えば、Exit Time 3.5 の遷移は、3.5 回ループを行った後 exitされる。

https://docs.unity3d.com/ja/2018.4/Manual/class-Transition.html#:~:text=Has%20Exit%20Time%20%E3%81%8C%E6%9C%89%E5%8A%B9,%E3%81%AE%E6%9D%A1%E4%BB%B6%E3%81%AF%20true%20%E3%81%A7%E3%81%99)%E3%80%82

Transition Durationは、現在のステートの持続時間に対する遷移時間。Fixed Duration モードに応じて、正規化された時間または秒で表される。これは、遷移グラフで 2つの青いマーカーに挟まれた部分として表示される。

Transition Offsetは、遷移先ステートの再生が開始される時点のオフセット。例えば 0.5 とすると、遷移先ステートは、そのタイムラインの 50% の時点から再生され始める。

//3Dでの地形操作Terrainの使い方

TerrainとはUnityに用意されている地形オブジェクトで、山や川を気軽に作成できる。

Createの3Dオブジェクトの中にTerrainがあるのでそれを選択。選択した際位置座標を示す矢印がオブジェクトの中央に来てしまっている場合は、画面上部のCenterボタンをPivotに切り替えることで、画面全体が見渡せるようになり作業しやすくなる。

これはカメラの位置が原点を写すように初期設定されているからで、原点をオブジェクトの端に持ってこれるPivotに設定することでカメラの視界が開けることを意味している。

Terrainのインスペクターの中にあるPaint Terrainボタンをクリックし、ドラッグ部分に地形を反映させるようにし、その下のRaise or Lower Terrainを選択することで隆起・沈降させることができるようになる。

この地形変化を取り消すには、Shiftキーを押しながら再度地形の上をドラッグすることで消すことができる。

ペイントの内容をオリジナルな内容に変更したい場合には、素材をダウンロードした後に、Paint Terrainボタンを選択し、リスト化らPaintTextureを選ぶ。そして、Terrain Layers項目でEdit Terrain Layers→Create Layerを選ぶことで、ダウンロードしたデザインを選ぶことができる。

また、Terrainから木も生やすことができ、TerrainのインスペクターからPaint Treesを選び、Edit Trees→Add TreeでTree Prefabから植える木を決めることができる。

これも同じようにドラッグしたら勝手に木が植えられていく。

人気の記事

1

皆さん、ついに、エアラインでも、サブスクリプションが始まったのはご存じですか? まだ実験段階ですが、ANAが、定額全国住み放題サービスを提供する「ADDress」と組んで、国内線を4回まで定額利用可能 ...

2

無料でネットショップを開けるアプリとして多くの人に驚きを与えたBASE株式会社が、2019年10月25日東証マザーズに上場しました。2020年2月時点で90万店を超えるショップを抱えるまでに成長してい ...

3

2011年にサービスを開始してから圧倒的な成長率を誇るインテリア通販サイト 【FLYMEe/フライミー】を皆さんご存じでしょうか。 「自分のイメージするインテリア、本当に欲しいインテリアがどこにあるの ...

4

ついに、noteの月間アクティブユーザー数が4400万人(2020年3月時点)に到達しました。 そもそも、「note」とは、クリエイターが、文章やマンガ、写真、音声を投稿することができ、ユーザーはその ...

5

ボードゲームカフェが1日2回転で儲かるという記事をみつけたので興味を持ち、調べてみました。 まずは、需要がどれくらいあるのか、市場のようすからみていきましょう。 世界最大のボードゲーム市場はドイツで、 ...

-code, ソーシャル
-,

Copyright© BUSINESS HUNTER , 2023 All Rights Reserved Powered by AFFINGER5.