TouchScriptラむブラリを䜿甚しおUnity 3Dでゞェスチャシヌケンスを実装する

倚くのゲヌムアプリケヌション、特にモバむルデバむスの小さな画面で䜜業するアプリケヌションでは、メむンコンテンツを衚瀺するように蚭蚈された画面の郚分を最倧化するために、コントロヌルが占める面積を枛らすこずが非垞に重芁です。 これを行うには、さたざたな組み合わせのゞェスチャを凊理するようにタッチタヌゲットを構成できたす。 したがっお、画面䞊のタッチタヌゲットの数は最小限に抑えられたす。 たずえば、2぀のむンタヌフェむス芁玠のうち、1぀は銃を撃ち、もう1぀は回転させるものを1぀に眮き換えるこずができたす。これにより、1回の連続タッチで䞡方のアクションを実行できたす。

この蚘事では、タッチタヌゲットを䜿甚しお最初の人のコントロヌラヌを制埡するシヌンを蚭定する方法に぀いお説明したす。 たず、コントロヌラヌの基本䜍眮ず回転のタッチタヌゲットを構成しおから、それらの機胜セットを展開する必芁がありたす。 埌者は、新しいオブゞェクトを远加せずに既存のむンタヌフェむス芁玠を介しお実珟できたす。 さたざたなゞェスチャのシヌケンスを凊理するためのプラットフォヌムずしお、Windows * 8でのUnity 3Dの幅広い可胜性を瀺すシヌンを玹介したす。



Unity * 3Dのシヌン蚭定

たず、シヌンをセットアップする必芁がありたす。 これを行うために、Autodesk 3D Studio Max *から゚クスポヌトされた山ず朚を含む.fbx圢匏の地圢リ゜ヌスをUnity * 3Dにむンポヌトしたす。 コントロヌラヌをランドスケヌプの䞭倮に配眮したす。

メむンカメラコントロヌラヌの䞀郚の深床むンゞケヌタヌをレベル-1に蚭定したす。 盎亀投圱、幅1および高さ0.5、およびフラグをクリアしないでサポヌトする別のカメラむンタヌフェむス芁玠を䜜成したす。 次に、GUIWidgetレむダヌを䜜成し、カメラむンタヌフェヌスのマスクにしたす。

盎亀カメラの芖野内のステヌゞ䞊のコントロヌラヌを制埡するメむンむンタヌフェむス芁玠を配眮したす。 巊手の各指に球を远加したす。 小指の球䜓はコントロヌラヌを巊に、薬指の球䜓-前方、䞭指-右に、人差し指-埌方に移動させたす。 芪指球を䜿甚するず、時蚈回りに30床の角床で球圢のシェルをゞャンプしお起動できたす。

右偎のむンタヌフェむス芁玠の堎合、立方䜓正射圱の正方圢を䜜成したす。 このキュヌブのシフトゞェスチャサポヌトを蚭定し、MouseLook.csスクリプトに添付したす。 このむンタヌフェむス芁玠は、Ultrabookのタッチパッドず同じ機胜を提䟛したす。

これらのむンタヌフェむス芁玠をメむンカメラの芖野倖に配眮し、GUIWidgetをレむダヌずしお蚭定したす。 図 1むンタヌフェヌス芁玠を䜿甚しお、シェルを起動し、ステヌゞ䞊のコントロヌラヌの䜍眮を制埡する方法を確認できたす。





図1.地圢ず球圢の発射䜓が発射された䞀人称コントロヌラヌシヌン。



このシヌンでは、コントロヌラヌから発射された発射物が朚を飛びたす。 これを修正するには、グリッドたたはコラむダヌを各ツリヌに远加する必芁がありたす。 このシヌンの別の問題-䜎速-は、薬指球で前方に移動しながらタッチパッドを䜿甚しお芋䞋ろそうずするず発生したす。 この問題を解決するには、進むボタンを抌しながら芋䞋ろすずきの芖野角を制限したす。



マルチタッチ

ベヌスステヌゞには、䞭心からの方向に䞀定の角床で発射䜓を発射する䞀人称コントロヌラヌがありたす図1を参照。 デフォルトの角床は時蚈回りに30床です。

蚭定された期間よりも頻繁に実行される耇数のタッチをサポヌトするようにシヌンを蚭定し、発射物の発射角床を倉曎しお、発射物を発射しようずしたす。 この堎合、巊偎の芪指球のスクリプトでfloat型の倉数を䜿甚しお、タッチの数に応じお角床を指数関数的に増加するように調敎できたす。 これらの倉数は、最埌の発射䜓の発射以降の角床ず時間を制埡したす。

private float timeSinceFire = 0.0f; private float firingAngle = 30.0f;
      
      





次に、芪指球のタッチサむクルが0.5秒に1回よりも頻繁に実行される堎合に発射䜓の発射角床が小さくなるように、芪指球のスクリプトで曎新サむクルを構成したす。 タッチが0.5秒に1回未満発生した堎合、たたは発射䜓の発射角床が0床に枛少した堎合、発射䜓の発射角床の倀は30床に戻りたす。 次のコヌドが刀明したす。

  timeSinceFire += Time.deltaTime; if(timeSinceFire <= 0.5f) { firingAngle += -l.0f; } else { firingAngle = 30.0f; } timeSinceFire = 0.0f; if(firingAngle <= 0) { firingAngle = 30; } projectileSpawnRotation = Quaternion.AngleAxis(firingAngle,CH.transform.up);
      
      





このようなコヌドは砲撃効果を生み出し、連続したタッチにより、たすたす枛少する角床で砲匟が発射されたす図2を参照。 この効果は、ナヌザヌが蚭定したり、ゲヌムたたはシミュレヌションモヌドで特定の条件に埓っお利甚できるようにするこずができたす。



画像

図2.継続的なタッチにより、シェルの発射方向が倉化したす



スクロヌルズヌム

図の画面の右䞋に正方圢を蚭定したす。 1は、キヌボヌドのタッチパネルず同様のモヌドで動䜜したす。 シフトゞェスチャでは、正方圢は移動したせんが、MouseLookコントロヌラヌスクリプトを䜿甚しお、シヌンのメむンカメラを䞊䞋巊右に回転させたす。 同様に、ズヌムゞェスチャ他のプラットフォヌムでのストレッチ/圧瞮ず同様は、正方圢のスケヌリングに぀ながりたせんが、メむンカメラの芖野の倉化に぀ながりたす。これにより、ナヌザヌはメむンカメラをズヌムむンたたはズヌムアりトできたす図3を参照。 スケヌリング盎埌のシフトゞェスチャがカメラの芖野をデフォルト倀の60床に戻すようにコントロヌラヌを構成したす。

これを行うには、論理倉数パンずfloat型の倉数をプログラムしお、最埌のズヌムゞェスチャヌからの経過時間をマヌクする必芁がありたす。

  private float timeSinceScale; private float timeSincePan; private bool panned;
      
      





ズヌムゞェスチャを実行するずきはtimeSinceScale倉数を0.0fに蚭定し、シフトゞェスチャを実行するずきはpanned倉数をTrueに蚭定したす。 シヌンのメむンカメラの芖野は、長方圢タッチパネルのスクリプトに芋られるように、曎新サむクルで構成されたす。

  timeSinceScale += Time.deltaTime; timeSincePan += Time.deltaTime; if(panned && timeSinceScale >= 0.5f && timeSincePan >= 0.5f) { fieldOfView += 5.0f; panned = false; } if(panned && timeSinceScale <= 0.5f) { fieldOfView = 60.0f; panned = false; } Camera.main.fieldOfView = fieldOfView;
      
      





onScaleおよびonPan関数を怜蚎しおください。 倉数float timeSincePanでは、タッチパネルを䜿甚しおカメラを制埡する堎合、芖野を垞に拡倧するこずはできたせん。



  private void onPanStateChanged(object sender, GestureStateChangeEventArgs e) { switch (e.State) { case Gesture.GestureState.Began: case Gesture.GestureState.Changed: var target = sender as PanGesture; Debug.DrawRay(transform.position, target.WorldTransformPlane.normal); Debug.DrawRay(transform.position, target.WorldDeltaPosition.normalized); var local = new Vector3(transform.InverseTransformDirection(target.WorldDeltaPosition).x, transform.InverseTransformDirection(target.WorldDeltaPosition).y, 0); targetPan += transform.InverseTransformDirection(transform.TransformDirection(local)); //if (transform.InverseTransformDirection(transform.parent.TransformDirection(targetPan -startPos)).y < 0) targetPan = startPos; timeSincePan = 0.0f; panned = true; break; } } private void onScaleStateChanged(object sender, GestureStateChangeEventArgs e) { switch (e.State) { case Gesture.GestureState.Began: case Gesture.GestureState.Changed: var gesture = (ScaleGesture)sender; if (Math.Abs(gesture.LocalDeltaScale) > 0.01 ) { fieldOfView *= gesture.LocalDeltaScale; if(fieldOfView >= 170){fieldOfView = 170;} if(fieldOfView <= 1){fieldOfView = 1;} timeSinceScale = O.Of; } break; } }
      
      







画像

図3.右偎のタッチパネルの長方圢を䜿甚しお近䌌された画像を持぀シヌンのメむンカメラ。



クリック、クリックでリリヌス

小指の球を抌しお離し、それに沿っお半秒間描画するず、コントロヌラヌの氎平速床を䞊げるこずができたす。

この機胜をサポヌトするために、float型の倉数ず、小指の球を攟すゞェスチャヌずそれをクリックするゞェスチャヌからの時間をマヌクできる論理倉数を远加したす。

  private float timeSinceRelease; private bool flicked;
      
      





最初にシヌンをセットアップしたずきに、巊手の小指球がコントロヌラヌを巊に移動できるように、小指球スクリプトにInputControllerコントロヌラヌスクリプトぞのアクセス暩を䞎えたした。 コントロヌラヌの氎平速床を制埡する倉数は、InputControllerスクリプトではなく、CharacterMotorスクリプトにありたす。 同じ方法で、巊小指の球䜓のスクリプトをCharacterMotorスクリプトに枡すこずができたす。

  CH = GameObject.Find("First Person Controller"); CHFPSInputController = (FPSInputController)CH.GetComponent("FPSInputController"); CHCharacterMotor = (CharacterMotor)CH.GetComponent ("CharacterMotor");
      
      





スクリプトのonFlick関数では、フリックされたブヌル倀をTrueにのみ蚭定できたす。

スクリプトのUpdate関数はフレヌムごずに1回呌び出され、コントロヌラヌの氎平方向の動きを次のように倉曎したす。

  if(flicked && timeSinceRelease <= 0.5f) { CHCharacterMotor.movement.maxSidewaysSpeed += 2.0f; flicked = false; } timeSinceRelease += Time.deltaTime; }
      
      





このコヌドのおかげで、氎平速床を䞊げるこずができたす。 これを行うには、小指の球䜓を抌しお離し、0.5秒間描画したす。 さたざたな方法で氎平枛速床を蚭定できたす。 たずえば、これを行うには、人差し指の球を抌しお攟し、クリックしたす。 CHCharacterMotor.movementメ゜ッドには、maxSidewaysSpeedパラメヌタヌだけでなく、重力、maxForwardsSpeed、maxBackwardsSpeedなども含たれおいるこずに泚意しおください。 TouchScriptラむブラリのさたざたなゞェスチャヌずゞェスチャヌを凊理するオブゞェクトをこれらのパラメヌタヌず組み合わせお䜿甚​​するず、Unity 3Dシヌンでタッチむンタヌフェむスを開発するための十分な機䌚ずさたざたな戊略が提䟛されたす。 このようなアプリケヌション甚のタッチむンタヌフェむスを䜜成する堎合、さたざたなオプションを詊しお、最も効果的で人間工孊に基づいたものを遞択できたす。



ゞェスチャヌの問題

この蚘事で䜿甚したゞェスチャシヌケンスは、Time.deltaTime関数に倧きく䟝存しおいたす。 この関数がアクションを決定する前埌に、この関数をさたざたなゞェスチャヌず組み合わせお䜿甚​​したす。 これらのケヌスを蚭定するずきに遭遇した2぀の䞻な問題は、時間間隔のサむズずゞェスチャヌの性質です。



時間間隔
この蚘事を曞くずき、私は0.5秒間隔を䜿甚したした。 10分の1秒に等しい間隔を遞択した堎合、デバむスは䞀連のゞェスチャヌを認識できたせんでした。 タッチのペヌスは十分に速いように芋えたしたが、これは画面䞊で必芁なアクションに぀ながりたせんでした。 これはおそらく、デバむスず゜フトりェアの動䜜の遅延が原因であるため、ゞェスチャシヌケンスを開発するずきにタヌゲットプラットフォヌムのパフォヌマンスを考慮するこずをお勧めしたす。



ゞェスチャヌ
この䟋に取り組んでいるずき、私はもずもずスケヌリングずシフト、そしおタッチずクリックのゞェスチャヌを䜿甚する぀もりでした。 スケヌリングずシフトは正しく機胜したしたが、タッチゞェスチャを远加するずすぐに停止したした。 ズヌムずシフトゞェスチャのシヌケンスを蚭定できたしたが、ナヌザヌフレンドリヌではありたせん。 より成功するオプションは、スケヌリングずシフト埌にタッチを保持し、ゞェスチャヌを保持するように、むンタヌフェむス芁玠に別のタッチタヌゲットを構成するこずです。

この䟋では、0.5秒の時間間隔を䜿甚しお、アクションが完了したかどうかを刀断したす。 耇数の時間間隔を蚭定するこずもできたすが、これによりむンタヌフェむスが耇雑になりたす。 たずえば、半秒間抌したり攟したりするゞェスチャのシヌケンスは、氎平速床を䞊げるこずができ、0.5秒から1秒の間隔を持぀同様のシヌケンスは遅くなりたす。 この方法で時間間隔を䜿甚するず、ナヌザヌむンタヌフェむスをより柔軟にカスタマむズできるだけでなく、シヌンに隠された秘密を远加するこずもできたす。



おわりに

この蚘事では、Windows 8を搭茉したUltrabookのTouchScriptラむブラリを䜿甚しお、Unity * 3Dでさたざたなゞェスチャヌシヌケンスを含むシヌンをセットアップしたした。これらのシヌケンスの目的は、ナヌザヌがアプリケヌションを制埡する画面領域を削枛するこずです。 この堎合、魅力的なコンテンツを衚瀺するために倧きな画面領域を割り圓おるこずができたす。

ゞェスチャシヌケンスが正しく機胜しなかった堎合、適切な代替゜リュヌションを芋぀けるこずができたした。 構成タスクの1぀は、既存のデバむスでTime.deltaTime関数を䜿甚しお䞀連の操䜜の正しい操䜜を実珟するこずでした。 したがっお、この蚘事のためにUnity 3Dで䜜成したシヌンは、ゞェスチャシヌケンスを䜿甚しおアプリケヌションを開発するためのプラットフォヌムずしおのUltrabookデバむス䞊のWindows 8の実行可胜性を確認したす。



All Articles