Unity研究所<Unityによるゲーム開発、映像開発>

Unity初心者40代後半中年中間管理職おやじが綴るゲームで小遣い稼ぎできるようになるまでのブログ

Unity 小ネタ スマホでのオブジェクトの操作 スライド

f:id:Harukichi:20210430001329g:plain

 

新たなスマートフォンのゲームアプリの開発中!!

 

カーソルの操作の制御で、画面に左右のボタンを設けて・・・というのはよくあるが、スマホだもんね

ボタンでの操作というのはやっぱ野暮じゃない?

 

てな感じで、画面のスワイプというかスライドでカーソルを動かすことに挑戦したので、やり方を書き残しておく

 

大まかな手順

①操作したいオブジェクトにEventTriggerを追加

スクリプトでオブジェクトが押されたこと、そのままスライドされたことを検知して、移動距離に応じてオブジェクトも動かす

 

◆Event Triggerの追加

操作したいオブジェクトにEvent Triggerを追加し、PointerDown、PointerUpのイベントが発生した時に呼び出す関数を割り付ける

f:id:Harukichi:20210430002012p:plain

 

スクリプトでの制御

//オブジェクトが押された(タップされた)イベント発生時に呼び出される関数

public void OnPointerDown()
{

   //押された状態に設定
   TapFlag = true;

   //押された位置を取得

   Vector3 pos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10f);

   //スマホ内の座標に変換して記憶しておく
   lastMousePos = Camera.main.ScreenToWorldPoint(pos);

}

//オブジェクトから指が離れた(タップをやめた)イベント発生時に呼び出される関数

public void OnPointerUp()
{

 //押されていない状態に設定
 TapFlag = false;

  //押された位置をクリア
 lastMousePos = Vector3.zero;

}

 

//Update関数にて、オブジェクトが押されている状態中を監視し、移動していたらオブジェクトの位置も更新

void Update()
{
  if (TapFlag)
  {

   //現在位置を取得

   Vector3 pos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10f);
   NewMousePos = Camera.main.ScreenToWorldPoint(pos);

 

   //前回位置からの移動量を算出 X座標のみ
   float DestX = NewMousePos.x - lastMousePos.x;

   //移動量をそのまま反映すると動作がもっさりなため10倍
   float Xpos = transform.position.x + DestX*10f;
   

   //画面内からはみ出さないようにX値を調整
   transform.position = new Vector3(Mathf.Clamp(Xpos, -12, 12),    transform.position.y, transform.position.z);

   //位置情報を更新

   lastMousePos = NewMousePos;

  }

}

 

◎今回の罠 ハマったポイント

 Camera.main.ScreenToWorldPoint()が今回のハマったポイント

 最初はこの関数にInput.mousePositionを引数として設定していたが、動かない

 よくわからないがカメラの位置情報のみが取得され、タップしている位置を変えても値も変化しない

 

 ということで、ググりまくること3時間(-_-メ)

 

 ようやく同じ罠にはまった先人の記事を発見!! (感謝)

 

 この関数の引数はVector3型で、Input.mousePositionからも当然Vector3値がセットされるものと思っていたが、xとyしか設定されず、zのデータがないので、ScreenToWorldPoint()からはまともなデータの取得ができない

 

 カメラにより表示される画面の内容はカメラの位置からZ方向に「10」離れた位置のものらしい

 なので、タップした位置データの作成は、タップした位置情報にz情報を10として設定している

  Vector3 pos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10f);

 

今回は以上

 

 

 

 

Unity 小ネタ アニメーションの切り替え 点灯、点滅

コインゲームの電飾表示的なものを作りたくて今日も悪戦苦闘

 

できたものは下記の通り

右側の5つあるボタンのようなものを、点灯⇒点滅⇒点灯という感じでアニメーションさせている

今日はこれをどうやって作ったかを書き残しておく

 

f:id:Harukichi:20210418225344g:plain

 

◆手順

①アニメーションの作成 Animation

②アニメーションの切り替えフローの作成 Animator

スクリプトでのアニメーションの切り替え

 

◆用意したもの

・UI Image

・消灯用のグレーのスプライト

・点灯用の色のついたスプライト

 

◆アニメーションの作成 Animation

UIのImageにAnimationを割り当てる

下記のメニューをクリックするとTimelineが表示されるので、真ん中のCreateボタンを押してアニメーションを作成

 

f:id:Harukichi:20210418230607p:plain

 

【消灯アニメーション】

Add PropertyからSpriteを選択すると、割り付けられているSpriteが自動で配置される

今回は表示が固定なので最初の位置のみにキーフレームを設定

f:id:Harukichi:20210418230003p:plain

 

【点灯アニメーション】

消灯と同じ要領で、グレーのSpriteが表示された状態で、プロジェクトのフォルダから色付きのSpriteをドラック&ドロップ

いらないグレーのSpriteのキーフレームは削除して、最初の位置にキーフレームを設定

f:id:Harukichi:20210418231209p:plain

 

【点滅アニメーション】

同じ要領で今度は色あり、色なし、色ありの順にキーフレームを配置

f:id:Harukichi:20210418231323p:plain

 

作成したアニメーションはプロジェクトウインドウの中に作成される

f:id:Harukichi:20210418232047p:plain

 

②アニメーションの切り替えフローの作成 Animator

アニメーションの切り替えフロー制御用のAnimatorを作成

 

f:id:Harukichi:20210418231454p:plain

 

作成すると、作成したオブジェクトのインスペクター上にAnimatorが追加され、Controllerの箇所に割り付けられているものが表示される

f:id:Harukichi:20210418232225p:plain

 

Animatorウインドウを開いて、①で作成したアニメーションをドラック&ドロップで配置

右クリックししてMake Transitionにて矢印をつないでいき、切り替えの流れを作成する

f:id:Harukichi:20210418232527p:plain

 

どのような条件で切り替えを行うかを設定する

・左上のParametersを押してプラスボタンを押して、切り替えの条件に使う変数を設定

・フローの矢印をクリックして、インスペクター上のConditionsに参照する変数と条件を設定する

 

下記の例の場合はこんな感じ

・変数 int型 名前はStatus

・切り替えの条件はStatusが2に等しくなった場合

f:id:Harukichi:20210418232905p:plain


スクリプトでのアニメーションの切り替え

やっていることは

・UI ImageのAnimatorを取得

・SetInteger関数を使用して、Status変数にint型の値を設定

 

f:id:Harukichi:20210418233442p:plain

 

今回の場合は、5個表示があり、上から順に点滅を開始し、常に一番下のみ点滅させたいので、消灯⇒点滅、その下のものを点滅させたらその上は点灯に切り替えているので、ややややこしくなっているが、やっていることは大したことはない

 

 

だいぶ適当な感じだが、覚書なので、あしからず

 

今日は以上

 

Unity 小ネタ Event Trigger 3Dオブジェクトをクリックして消去

f:id:Harukichi:20210402232656g:plain

新しいアプリの試作中!!

 以前下記のような2Dで作った、ボールを数字の順番にタップして消していくゲームを、3Dにしたら見え方が違って何かひらめかないかなぁと思い作ってみたが、微妙(-_-メ)

 

harukichi.hatenadiary.jp

 

まあ、せっかく作ったので、その中で3Dのオブジェクトをクリックして消すという制御を行うにあたり「Event Trigger」なるものを活用したのでメモしておく

 

〇実装方法

 やりたいことは、ボールをクリックして消すということ

 なので、ボールのGameObjectにクリックしたというイベントを発生させたいので、ボールのPrefabに、インスペクター上でAdd New Event Typeボタンを押して適しているイベントタイプを選択し、Event Triggerを追加する

 今回はPointerDownを使用してみたが、PointerClickでもOK

 

f:id:Harukichi:20210402234755j:plain

 

クリックイベントが発生した時に呼び出される関数を割り付ける

f:id:Harukichi:20210402234259j:plain



◆クリックイベント発生時に呼び出される関数のスクリプト

今回は次に消すべき数字のボールと、クリックしたボールの番号が一致したら、ボールを消しつつ、消滅エフェクトを発生させている

f:id:Harukichi:20210402234023p:plain

 

前回の2Dボール消しの場合は、Raycastを使ってクリックした箇所の下にオブジェクトがいるかどうかで判定していたが・・・・

こちらの方がインスペクター上で設定できるので、わかりやすいかなぁ

 

今回は以上

 

 

Unity 小ネタ DOTweenを使ってみた!!

youtu.be

 

前々から、便利だという噂はネットの記事やTwitterなどで見ていたが、テキストのアニメーションなんかも自分で実装できた方がいいに決まっているという頑固一徹を通してきたが・・・

 

まあまあ、できるようになったし

 

テキストのアニメーションとか、UIのアニメーションのエキスパートになりたいわけではないし

 

土日しか時間がない中では、だんだん効率を重視したくなり

 

とうとう手を出しました!!

 

f:id:Harukichi:20210307213011g:plain

DoTweenで文字を動かしてみた

 

お分かりだろうか??

 

 

 

 

わかりにくい(-_-メ)

 

 

文字のスプライトが下から上がってきて、フェードで消えるというやつ

 

DOTweenのアセットのインストール、初期設定は下記を参考にさせてもらいました

(ありがとうございました!!)

amagamina.jp

 

◆今回の実装スクリプト

テキストのスプライトにアタッチして使用

 

まずは使えるようにするおまじない

using DG.Tweening;

 

public class RogoCrtl : MonoBehaviour
{

 //移動 移動量、移動時間はインスペクターで設定できるようにしている 
public float MoveX = 0;
public float MoveY = 0;
public float MoveZ = 0;
public float MoveDuration = 1.5f;
public float FadeDuration = 1.0f;

bool IsReady = true;

 

public void Action()
{

  //準備ができているかのフラグ
  IsReady = false;

 

    //初期位置に戻すために位置を覚えておく
  Vector3 oldposition = transform.position;

 

  //ここが本題

  //移動
  transform.DOLocalMove(new Vector3(MoveX, MoveY, MoveZ), MoveDuration)
   .SetRelative() //相対距離に設定
   .SetEase(Ease.OutCubic) //終わりに向けてスピードが遅くなるように設定
   .OnComplete(() => { //処理が終了した時のコールバック

    //フェードアウト

    GetComponent<SpriteRenderer>().DOFade(0, FadeDuration)
     .OnComplete(() => { //処理が終了した時のコールバック
      transform.position = oldposition; //元の位置に戻す
      GetComponent<SpriteRenderer>().DOFade(1, 0.1f) //元の濃さに戻す
       .OnComplete(() => { //処理が終了した時のコールバック
        IsReady = true; //処理が終了したのでフラグを更新


       });
     });
   });

}

 

 

〇インスペクター

f:id:Harukichi:20210307214055p:plain

インスペクターで移動量等を設定

下から上に移動させるので、Y軸に移動距離を入力

移動する時間を0.5秒に

フェードアウトの時間を1秒に

 

◆動きの参考にさせてもらったサイト (ありがとうございました!!)

 

game-ui.ne

以上

Unity 小ネタ シングルトンでシーンが移動してもBGMが途切れないようにする

前に同じようなネタを記事にした記憶が・・・

 

と思って探してみたらやはりあった!!

harukichi.hatenadiary.jp

 

この方法は、Awake()の中でDontDestroyOnLoad(gameObject)を読んでいるだけなので、すべてのシーンで同じBGMを流し続けるならよいが、下記のような場合は途中でBGMは変えたいところ・・・

 

①タイトルのシーン  ⇒BGM開始

②ゲーム選択のシーン ⇒ここまでは途切れることなくBGMを流しておく

➂実際のゲームシーン ⇒ここからはBGMを変える

 

ということで、「シングルトン」なるもので実装してみた

 

★タイトルのシーンのスクリプト

タイトルのシーンのインスタンスを後からアクセスするために削除されないようにする

BGMはAudiosourceで自動でならす

public static StartSceneManager  instance = null;  

private void Awake()
{

    if (instance == null)
    {
         instance = this;
         DontDestroyOnLoad(gameObject);

    }
    else
    {
       Destroy(gameObject);

    }
}

 

BGMをほかのシーンからアクセスして止めるために関数を作っておいた

public void BGMStop()
{
  audioSource.Stop();

}

 

〇実際のゲームシーンに移動する場合のスクリプト

 次のシーンを呼び出す前か、次のシーンのStart関数にて

   下記のようにinstanceを介して、BGMを止める関数にアクセス

 

   StartSceneManager.instance.BGMStop();

 SceneManager.LoadScene("GameScene");

 

 

説明は以上

 

BGMを切り替えるぐらいだったら他にも方法はありそうだが・・・

シングルトン自体はいろいろ使えそうな感じがする

 

 

 

【Space Kroon】プライバシーポリシー

【Space Kroon】プライバシーポリシー

 

Y’Mfc(以下「当方」という)は、当方の提供する【Space Kroon】の利用者(以下「ユーザー」という)に関する個人情報を含んだ情報(以下「ユーザー情報」という)の取扱いについて、以下のとおりプライバシーポリシー(以下「本ポリシー」という)を定めます。

 

1.情報を取得するアプリ提供者

Y’Mfc

 

2.取得するユーザー情報と目的

本アプリケーションで取得するユーザー情報と目的は以下のとおりです。

取得するユーザー情報

利用目的

 

端末に関する情報

なし

 なし  
 

位置情報

なし

・ユーザーに最適化された広告の提供

・位置情報に基づく広告の提供

・パフォーマンス分析

・アプリケーションの改善

・ユーザーへのサポート

 

 
 

広告に関する情報

・表示場所

・クリックの有無

・閲覧回数

・広告の製品またはサービスの利用状況

 

 

3.取得方法

当方は、情報収集モジュールを内蔵した本アプリケーションにより、ユーザー情報を自動取得します。

 

4.通知・公表または同意取得の方法・利用者関与の方法

(1)通知・公表

当方は、本ポリシーに関する通知・公表は本アプリケーションまたは当方のホームページに掲載する方法で行います。

 

(2)同意取得の方法

同意の取得は、本アプリケーションの初回起動時に取得する方法で行います。

 

(3)利用者関与の方法

ユーザー情報の取得は、本アプリケーションをアンインストールすることで中止することができます。

 

5.お問い合わせ

当方のプライバシーポリシーに関する、ご意見、ご質問、苦情の申出その他ユーザー情報の取扱いに関するお問い合わせは、以下の窓口にご連絡ください。

 

ys.mfc.sp@gmail.com

 

6.改定

当方は、当方の裁量に基づいて、本ポリシーを変更します。但し、取得するユーザー情報、利用目的、第三者提供に変更が発生した場合、本アプリケーションまたは当社のホームページで通知するとともに、本ポリシー変更後、本アプリケーションの初回起動時に改めてユーザーから同意を取得します。

 

7.Y’s MFCプライバシーポリシー

本ポリシーに定めのない事項については、Y’s MFCプライバシーポリシーが適用されます。

 

 

8.制定日・改定日

制定:2021年02月28日

 

プライバシーポリシー

①個人情報の利用目的

「Unity研究所<Unityによるゲーム開発、映像開発>」(以下当ブログ)では、メールでのお問い合わせ、メールマガジンへの登録などの際に、名前(ハンドルネーム)、メールアドレス等の個人情報をご登録いただく場合がございます。

これらの個人情報は質問に対する回答や必要な情報を電子メールなどをでご連絡する場合に利用させていただくものであり、個人情報をご提供いただく際の目的以外では利用いたしません。

②個人情報の第三者への開示

当サイトでは、個人情報は適切に管理し、以下に該当する場合を除いて第三者に開示することはありません。

・本人のご了解がある場合

・法令等への協力のため、開示が必要となる場合

個人情報の開示、訂正、追加、削除、利用停止

ご本人からの個人データの開示、訂正、追加、削除、利用停止のご希望の場合には、ご本人であることを確認させていただいた上、速やかに対応させていただきます。

③広告の配信について

当サイトは第三者配信の広告サービス「Google Adsense グーグルアドセンス」を利用しています。

広告配信事業者は、ユーザーの興味に応じた広告を表示するためにCookie(クッキー)を使用することがあります。

Cookie(クッキー)を無効にする設定およびGoogleアドセンスに関する詳細は「広告 – ポリシーと規約 – Google」をご覧ください。

三者がコンテンツおよび宣伝を提供し、訪問者から直接情報を収集し、訪問者のブラウザにCookie(クッキー)を設定したりこれを認識したりする場合があります。

アクセス解析ツールについて

当サイトでは、Googleによるアクセス解析ツール「Googleアナリティクス」を利用しています。

このGoogleアナリティクスはトラフィックデータの収集のためにCookieを使用しています。このトラフィックデータは匿名で収集されており、個人を特定するものではありません。この機能はCookieを無効にすることで収集を拒否することが出来ますので、お使いのブラウザの設定をご確認ください。この規約に関して、詳しくはここをクリックしてください。

⑤当サイトへのコメントについて

当サイトでは、スパム・荒らしへの対応として、コメントの際に使用されたIPアドレスを記録しています。

これはブログの標準機能としてサポートされている機能で、スパム・荒らしへの対応以外にこのIPアドレスを使用することはありません。また、メールアドレスとURLの入力に関しては、任意となっております。全てのコメントは管理人が事前にその内容を確認し、承認した上での掲載となりますことをあらかじめご了承下さい。加えて、次の各号に掲げる内容を含むコメントは管理人の裁量によって承認せず、削除する事があります。

・特定の自然人または法人を誹謗し、中傷するもの。

・極度にわいせつな内容を含むもの。

・禁制品の取引に関するものや、他者を害する行為の依頼など、法律によって禁止されている物品、行為の依頼や斡旋などに関するもの。

・その他、公序良俗に反し、または管理人によって承認すべきでないと認められるもの。

⑥免責事項

当サイトで掲載している画像の著作権・肖像権等は各権利所有者に帰属致します。権利を侵害する目的ではございません。記事の内容や掲載画像等に問題がございましたら、各権利所有者様本人が直接メールでご連絡下さい。確認後、対応させて頂きます。

当サイトからリンクやバナーなどによって他のサイトに移動された場合、移動先サイトで提供される情報、サービス等について一切の責任を負いません。

当サイトのコンテンツ・情報につきまして、可能な限り正確な情報を掲載するよう努めておりますが、誤情報が入り込んだり、情報が古くなっていることもございます。

当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。