Skeyllのブログ

インディーデベロッパー

The GOD AIM (ENG)


f:id:Skeyll:20190815214136p:plain

f:id:Skeyll:20190815214353j:plain



app info

The aim training app for mobile fps game.
Can customize a wepon recoil, a position and size of UI button ,camera sensi, and ON/OFF of shoothing sound and player model.
Have three tarining modes.
ReaderBoard(only Hard).
You can play The GOD AIM if your phone is off-line.
app file is about 20MB

exp game modes

youtu.be

Standard
・Target apper randomly
・At hit 6 targets, the amount of target increase
・point
hit
10+(2*combo count)

miss
minus 5
reset combo count

React
・Target apper randomly
・At hit 10 targets, the amount of target increase
・point
hit
10+(2*combo count)

miss
minus 5
reset combo count

can't hit and a target disapper
minus 5
reset combo count


Track
・Move on holizeon randomly
・At stopping ,the target speed get faster
・point
hit
10+(combo count)

miss
minus 5
reset combo count


Download

Android
play.google.com
iOS
plz wait for a little


Release note

ver 1.33
Change the timing sing in PlayGame
Fix LeaderBoard

ver 1.32
Delete the method to export a game record as a image
Stop getting permission about strage
Rewrite PraivacyPolicy to detail
Add the background image to display a game record for Dark Theme
Change the method of "Auto Shooting"
Change the way to instantiate target (only internal change)
(Maybe) Fix LeaderBoard

ver 1.31
Fix about target bug

ver 1.3 (thx suggestion!)
Change the single shoot system ( from tap to un-tap)
Add some cusutomize button for changing recoil and camera sensi
Display the parameter of recoil and camera sensi

ver 1.23
Change the shoot system for fixing the bug that can't perform at single shoot.

ver 1.22 
Fix the problem that user can't sing in GooglePlayService
Change the shooting order ( from "shooting sound, hit target, recoil" to "hit target , shooting sound , recoil)
Reduce ads


ver 1.21
Add PrivacyPolicy
Change the title image (hitting mark from "O" of GOD to "A" of AIM)

ver 1.2
Release

【Discord】プリンセスコネクトクランバトル凸管理BOT【プリコネ】

 Discordの凸管理BOT。現在できることは「予約」、「予約表示」、「予約一覧表示」、「予約削除」、「予約全削除」、「予約者に通知」。
スプレッドシートとの連携予定。使用言語はPython。必要な機能や疑問があればツイッターまで。

BOT運用には初期設定時にパソコンが必要(スマホだけでもがんばればできる)。運用だけならプログラミング関係の知識は不要。導入に必要な時間は30分〜1時間。
導入例、
f:id:Skeyll:20190826095721p:plain

BOTトークンの取得

Discord Developer Portal
 上記ページにアクセスし、NewApplycationより利用するアプリを作成。ここで設定したNAMEやアイコンは自分以外は見ることがないので適当でいい。
f:id:Skeyll:20190816152820p:plain

 左側のBot、AddBotから新しいBOTトークンを作成。ここで作成したBOTBOTを呼び出した際にチャット欄に表示される。
Bot作成後のページ下部にあるPamissionでBotに権限を渡すことができる。配布するBotでは権限の必要なことはしないのでチェックしなくてもいい。
f:id:Skeyll:20190816152847p:plain

 トークンのIDを使うのでコピーもしくはClick to Reveal TokenをクリックしてでてきたIDをコピーする。なお、このIDを公開するとBOTを乗っ取られるので知らない人には教えない方がいい。
f:id:Skeyll:20190818175231p:plain



BOT用のスクリプトをダウンロード

 ここのPrincessConnect以下のファイルを全てダウンロードする。Rawを右クリックして「名前を付けてリンク先を保存する。」で保存できる。そしてPrincessConnect.pyの上の方のTOKEN = ‘TOKENID’の部分を先ほどコピーしたIDに変更する。

f:id:Skeyll:20190818200729p:plain


BOTのコードを変更する

 入力時のキーワードや返信内容を変更する場合はコード上で””で囲っている部分を変更すると変わる。ただし「rsv」のように最初にくるキーワードが普段使うような単語だと普段のチャットで起動してしまうことがあるので日本語や名前等を使う場合は注意。
f:id:Skeyll:20190901084748p:plain


 もし大幅な変更を加える場合は更新方法が二つある。一つ目はメモ帳等でコードを変更してからherokuで起動してherokuのコンソール上でエラーを確認する方法。二つ目はPython環境をパソコン上に構築してコードが起動するか確認したあとにheroku上で確認する方法。プログラミングに興味がない場合は一つ目の方法がおすすめ。


 あとは公式サイトを見ればだいたいわかる(とくにAPIの部分)。


 DiscordBOTにはPython以外にもJavascriptC#などでライブラリ(Discord用の機能を簡単に導入できるもの)が用意されているので、得意な言語があるならそちらを使うといいかもしれない。


BOTを常駐させる

 Herokuというリモートサーバーを借りてリモートサーバー上でプログラムを起動して24時間運用する(2019年8月現在の利用料金は月1000時間無料。つまり、二つ以上利用しなければ常に無料)。導入方法は下記を参照。(※クレカを登録しなければ750時間まで無料なので20日強で限界が来る。仮に登録しても自動で課金されることはない)
Pythonで実用Discord Bot(discordpy解説) - Qiita
注意点
・procfileは名前をつけて保存する際に""で名前を囲う。
・procfileのDiscordbot.pyはスクリプトのpyファイルと同じ名前にする(上のものをそのまま利用する場合はPrincessConnect.pyで大文字小文字も合わせる。)
・普段プログラムを触らないなら2つ目の方法を利用する。(その際ファイルは直接Github上で追加する)
Githubはパブリックではなく、プライベートで作る。(IDを載せるため)


初期コマンド

 チャットを特定の単語から始めることでBOTが反応する。特定の単語が先頭なら数字が先でも他の単語が先でも可。
・rsv 1 - 5
 凸予約。数字の順番は自由。同じ番号は同一の投稿で予約できない。
 例 rsv 124、rsv421
・fin 1 - 5
 指定した予約リストから名前を消す。予約していないものが一つでもあれば削除はされるが通知がでない。
 例 fin 143
・rsv list 1 - 5
 指定したリストを表示。数字の順番は自由だが昇順で表示。
 例 rsv 15 list
・rsv!
 リスト5つ全て表示する。
・rsv END
 全てのリストからすべての名前を消す。
・ment 1-5
 特定のリストに含まれる人全員にmentionを送る。 例 ment 123
・cmd
 コマンドとその説明の一覧を表示。


参考
Rapptz/discord.py: An API wrapper for Discord written in Python.
https://github.com/Rapptz/discord.py
Welcome to discord.py — discord.py 1.2.3 documentation
https://discordpy.readthedocs.io/en/latest/index.html
Pythonで実用Discord Bot(discordpy解説) - Qiita
https://qiita.com/1ntegrale9/items/9d570ef8175cf178468f
Pythonのif文による条件分岐の書き方 | note.nkmk.me
https://note.nkmk.me/python-if-elif-else/
【VOICEROID解説】Python環境でDiscord Botを作る。 Part1 前準備編 discord.py rewrite 修正版 - Niconico Video
https://www.nicovideo.jp/watch/sm33794231
python - Pythonで二次元配列の中の各要素のn番目だけを取り出して、要素として並べたい - スタック・オーバーフロー
https://ja.stackoverflow.com/questions/47331/pythonで二次元配列の中の各要素のn番目だけを取り出して-要素として並べたい

The GOD AIM(日本語)


f:id:Skeyll:20190815214136p:plain

f:id:Skeyll:20190815214353j:plain




アプリ情報

モバイルFPS向けのエイムトレーニングアプリ。
反動、カメラ感度、UIの設定、銃声、キャラクターモデルのオンオフが可能。
レーニングのモードは三種類。
ランキング機能あり(難易度Hardのみ)。
アプリサイズは20MB前後で、インターネットに接続していない場合でもプレイ可能。

モードの説明

youtu.be

Standard
・的がランダムに出現
・6回当てるごとに的の出現数が増加
・得点
当てた場合
10+(2*継続回数)

外した場合
マイナス5
継続回数のリセット


React
・的がランダムに出現
・10回当てるごとに的の出現数が増加
・得点
当てた場合
10+(2*継続回数)

外した場合
マイナス5
継続回数のリセット

当てずに的が消えた場合
マイナス5
継続回数のリセット


Track
・的がランダムに左右に移動
・停止するたびに移動速度が上昇
・得点
当てた場合
10+(継続回数)

外した場合
マイナス5
継続回数のリセット


ダウンロード

Android
play.google.com
iOS
公開次第追加

更新情報

ver 1.33
GooglePlayにログインするタイミングをMenu変遷時に変更
リーダーボードを修正(NameSpaceを追加)
x84への対応をやめる(スマホ1、時計っぽいのが5つ非対応に)

ver1.32
ゲーム内でスコア詳細だけを画像保存する機能を削除
プライバシーポリシーを詳細に更新(英、日のみ。中、韓はそのうち追加予定)
テーマダークに配慮してゲーム結果表示の際に背景を追加
Auto射撃のプログラムを少し変更(ボタンを押すたびに射撃システムを一巡させていたのをゲームモード移行時点で一部メモリ上に保存)
ターゲットの当たり判定をプログラムから明示的に管理(一部端末でターゲットにヒットしなかった問題が解決する?)
(多分)リーダーボードの機能を修正

ver 1.31
更新時にTarget関連のバグが発生したのを修正

ver 1.3 (提案してくれた方ありがとうございます!)
単射時の射撃タイミングをタップ時から指を話した瞬間に変更
武器とカメラ感度調整の変更をボタンからも行えるように変更
武器とカメラ感度の数値を可視化

ver 1.23
前回の更新以降ゲーム中に射撃ができないバグが発生したため、銃声や当たり判定の順で加えた変更を少し修正
※同時期にGooglePlayGameService関連で手を加えたものがあるため、この修正で治らなければそちら側の変更を検討

ver 1.22 
GooglePlayServiceにログインできなかった問題を修正
プライバシーポリシーの文言を一部変更(4か国語という表記から具体的な言語名の羅列に変更)
【銃声サウンド再生、当たり判定の発生、反動】という順から【当たり判定の発生、銃声サウンドの再生、反動】の順に変更
ゲーム終了時に表示される広告を4回ごとから5回ごとに変更

ver 1.21
プライバシーポリシーを追加
タイトル画像でGODのO部分に銃創を入れていたのが宗教的な配慮に欠けるためAIMのAに銃創を移動

ver 1.2
リリース

【Unity】ゲームの記録を複数保存する

 ゲームの結果や得点を複数記録してスコア履歴やハイスコアランキングのようなものを作る場合は、鍵に整数型を使って記録した番号も保存するか、新しく記録する際に降順でデータを上書きしていく。ここではPlayerPrefsで後者を使ってスコア履歴を実装する方法を紹介する。Jsonやセーブするアセットを使って保存する場合も同じ方法で実装できる。

得点履歴の作成

//This script is released under the MIT License.
using UnityEngine;
using System.Collections;

public class SaveManager : MonoBehaviour
{
    public void SaveScore()
    {
        //1
        OverwriteRecord();
        //4
        int score = GetComponent<Script>().score;
        PlayerPrefs.SetInt("Score1", score);

        PlayerPrefs.Save();
    }

    void OverwriteRecord()
    {
        //2
        int saveNum = 10;
        //3
        while (saveNum >= 1)
        {
            int loadNum = saveNum - 1;
            
            if (PlayerPrefs.HasKey("Score" + loadNum.ToString()))
            {
                int loadScore = PlayerPrefs.GetInt("Score" + loadNum.ToString());

                PlayerPrefs.SetInt("Score" + saveNum, loadScore);

                saveNum -= 1;
            }
            else
            {
                saveNum -= 1;
            }
        }
    }
}
1.データを上書きするメソッドを呼ぶ

 複数の記録を保存する場合は降順でデータを保存しなおさなければならない。もし、先に上書きしなければ、新たに保存したデータが既存のデータを上書きすることになる。そのため、最新のデータを保存する前に一度上書きするメソッドを呼ぶ。

2.保存するデータの数を決める

 保存するデータの数を宣言する。ここで宣言した数分の履歴が生まれる。

3.既存のデータの上書き

 whileを使って降順でデータを上書きしていく。2で決めた数が一番最後のデータであり、そこに1減らした鍵で保存してあるデータを上書きする。通常の記録では昇順で保存していくため、一定の回数保存するまでは後ろの数字にデータは保存されていない。そのため、鍵の有無を確認して、あった場合のみデータの上書きをする。そして鍵があった場合もなかった場合も数字を減らし、これを1になるまで繰り返す。

4.最新のデータを保存する

 保存する変数を宣言する。PlayerPrefsではInt,Float,Stringの三種類が保存できる。ここでは得点のみを保存するため一つのみ宣言しているが、ほかにも保存する場合は保存するものに応じた変数を宣言する。ここではscore1つだけを宣言してるため、ここで参照もしているが、複数記録する場合はあらかじめStart等で取得しておくのがいいだろう。なお、このスクリプトから参照するため、取得先の保存する変数はpublicにする必要がある。もし、同一スクリプト内で記録を実装するならprivateでいい。

使用例

 Scriptという名前のスクリプトとScoreManageを空のオブジェクトにアタッチする。UIのButtonを三つ用意しそれぞれScore、Save、Loadという名前に変更する。各ButtonのOnClickイベントに上記の空のオブジェクトの対応するメソッドを登録する。これでScoreボタンを押した数だけ点数が増え、Saveを押すとデータを保存、Loadを押すとログに保存したデータが表示される。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Script : MonoBehaviour
{
    public int score;
    SaveManager saveManager;

    void Start()
    {
        saveManager = GetComponent<SaveManager>();
    }

    public void GetScore()
    {
        score += 1;
    }

    public void Save()
    {
        saveManager.SaveScore();
    }

    public void Load()
    {
        int saveNum = 1;

        while (saveNum <= 10)
        {
            if (PlayerPrefs.HasKey("Score" + saveNum.ToString()))
            {

                int loadScore = PlayerPrefs.GetInt("Score" + saveNum.ToString());

                Debug.Log(saveNum + "のデータは" + loadScore);
                saveNum += 1;
            }
            else
            {
                saveNum += 1;
            }
        } 
    }
}

ライセンス

Copyright (c) 2019  Skeyll

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


参考
Unity - Scripting API: PlayerPrefs
https://docs.unity3d.com/ScriptReference/PlayerPrefs.html

【Unity】TouchScriptの使い方

 TouchScriptを導入することで多くのデバイスに対応した複雑なタッチ処理を行える。MITライセンスオープンソース化されており、AseetStoreもしくはGitHubから無料で入手して利用できる。タッチスクリプトではイベントハンドラに独自のイベントを追加し、入力受けたら登録したイベントの処理を行っている。
 なお、以下の説明は多くが公式GitHubの要約である。


導入

1. AssetStoreもしくはGitHubからダウンロード後、インストール。
2. PrefabsフォルダのTouchManagerCursorsをゲームビューに追加。
3. カメラにComponent/TouchScript/Layerを追加。
4. Component/TouchScript/Gestures、もしくは作成したジェスチャースクリプトをオブジェクトに追加。

 以上で入力を扱えるようになる。レイヤーに関してはStandard Layer3D、2D、UIのオブジェクトFullScreenLayerカメラを操作する場合に必要となる。また、テストの実行中にAltを押した後に入力するとダブルタップのシミュレーションが行える。


ジェスチャーの種類

個別的なもの
1.TapGesture
 Events: Tapped
 Messages: OnTap.
2.PressGesture(Friendly)
 Events: Pressed
 Messages: OnPress.
3.ReleaseGesture  (Friendly)
 Events: Released
 Messages: OnRelease.
4.LongPress Gesture
 Events: LongPressed, Messages: OnLongPress.
5.Flick Gesture
 Events: Flicked
 Messages: OnFlick.


連続的なもの
1.Transform Gesture
 Events: TransformStarted, Transformed, TransformCompleted
 Messages: OnTransformStart, OnTransform, OnTransformComplete.
2.Screen Transform Gesture
 Transform Gestureと同じだが、スクリーンの座標を参照。
 Events: TransformStarted, Transformed, TransformCompleted
 Messages: OnTransformStart, OnTransform, OnTransformComplete.
3.Pinned Transform Gesture
 Transform Gestureに似ているが、オブジェクトが中心で固定されて動けない場合は固定された点を軸に回転と大きさの変更が行われる。
 Events: TransformStarted, Transformed, TransformCompleted
 Messages: OnTransformStart, OnTransform, OnTransformComplete.
4.Meta Gesture
 すべてのタッチイベントを個別のイベントに再割り当てする。他のジェスチャーを使うほうが望ましい。
 Events: TouchBegan, TouchMoved, TouchEnded, TouchCancelled
 Messages: OnTouchBegan, OnTouchMoved, OnTouchEnded, OnTouchCancelled.
 ※なお上記の1-3のイベントは基本的には二つ目のタッチ入力まで機能する。

 通常ジェスチャーの入力が行われた際に、そのオブジェクトと親からの入力は一時停止する。つまり、初めの入力が排他的に処理される。しかし、いくつかのジェスチャーは他のジェスチャーと同時に入力することが可能であり、そのジェスチャーはライブラリー内でFriendlyと呼ばれている。
 Friendlyジェスチャーを作る方法は以下の二種類ある。
1. Inspector上でもう一方のFriendly Gesturesリストにドロップ&ドラッグ。
2.gesture1.AddFriendlyGesture(gesture2);を呼ぶ。

イベントを登録

 新たな挙動を実装するためにイベントハンドラにイベントを追加する。追加にはOnEnableOnDisanableメソッドを使い、入力があったときだけイベントの処理を行う。常時イベントを登録しておかないのは、メモリリークの原因となるためである。
 イベントの登録TouchManegerに直接することもできるが、特定のジェスチャーのみを使用する場合は個別のイベントに登録した方が入力の識別が早くなる
 イベントハンドラの利用にはNameSpace Systemを使う。また利用するジェスチャーにもNameSpaceが必要である。必要なNameSpaceは「ジェスチャーの種類」から利用したいジェスチャーの個別ページに飛び、上部のNamespaceに記載のあるものである。また登録するイベントハンドラは「ジェスチャーの種類」、もしくは個別のページのEventsで確認できる。

using System; //イベントハンドラに必要。
using TouchScript.Gestures; //Tap入力に必要。

void OnEnable()
{
 //TappedEventのイベントハンドラに登録している。
 GetComponent<TapGesture>().Tapped += tappedHandler;
}

void OnDisable()
{
 GetComponent<TapGesture>().Tapped += tappedHandler;
}

void tappedHandler(object sender, EventArgs e)
{
 //Tap入力があったときに行う処理。
}


イベントハンドラ

 イベントが発生したときに、その発生したという処理を受けて行う処理のことをイベントハンドラと呼ぶ。void形で引数にEventArgs型を持ち、プロパティとして振る舞うデリゲートのようなものである。
 通常、処理はプログラムによりさまざまに異なる。しかし、「入力を受けた」というイベントの発生を認識する処理自体は汎用的なものである。そのため、イベントの処理を受ける部分と実際の処理を行う部分(イベントハンドラ)を切り分けることができる。こうしたプログラムのことをイベント駆動型プログラムと呼ぶ。


処理を作成する

 TouchScriptにはいくつかの関数が用意されている。例えば、タッチしたスクリーン上の座標の取得や、フレーム間でのスワイプの距離の取得などである。これらはTouchScriptのジェスチャーに対して処理が行われている。また関数を使う場合、追加でNameSpaceが必要になることがある。個別の関数のページに行き、記載していないNameSpaceが必要な場合は追加する。
 以下の例ではTapGestureのScreenPositionを使い、タップした場所のスクリーン上の座標を取得してる。関数の一覧は各ジェスチャーページのPropertiesで確認できる。

using System; //イベントハンドラに必要。
using UnityEngine;
using TouchScript.Gestures; //Tap入力に必要。

public class GetTouchPosition : MonoBehaviour
{
//関数を使うため取得。Startで取得してもいい。
[SerializeField]
TapGesture tapGesture; 

void OnEnable()
{
 //Serializeで取得してるため、ここでGetComponentする必要はない。
 tapGesture.Tapped += OnTapped;
}

void OnDisable()
{
 tapGesture.Tapped += onTapped;
}

void OnTapped(object sender, EventArgs e)
{
 Vector2 tapPosition = tapGesture.ScreenPosition;
 Debug.Log(tapPosition + "をタップした");
}



参考
TouchScript
https://github.com/TouchScript/TouchScript
Writing a Custom Gesture
https://github.com/TouchScript/TouchScript/wiki/Writing-a-Custom-Gesture
イベント - C# によるプログラミング入門 | ++C++; // 未確認飛行 C
https://ufcpp.net/study/csharp/sp_event.html
Unityにおける簡単なジェスチャー取得 - WonderPlanet DEVELOPER BLOG
http://developer.wonderpla.net/entry/blog/engineer/Unity_TouchScript/
【Unity】タッチジェスチャを簡単に実装できる「TouchScript」の基本的な使い方を紹介 - コガネブログ
http://baba-s.hatenablog.com/entry/2018/03/22/085900
TouchScriptアセットのチュートリアルを試した | D.YAMA Blog
http://blog.d-yama7.com/archives/223

【Unity】タッチ入力でカメラを回転させる

 タッチ入力でカメラを操作するには、タッチ入力の移動距離を取ってその値を回転に加える。今回はTouchScriptScreenTransformGestureを使ってこの機能を実装する。


1.FullScreenLayerとScreenTransformGestureをアタッチ

 回転させるオブジェクトにFullScreenLayerScreenTransformGestureをアタッチする。LayerはMainCameraGestureはTranslationにチェックを入れる。これらをつけたオブジェクトが回転するため、カメラにつけた場合は一人称視点プレイヤーやオブジェクトなどにつけた場合は三人称視点になる。

2.スクリプトの作成

 移動距離を取得し、その値をオブジェクトのオイラー角に加えて回転させる。タッチでカメラを操作する場合、画面をスワイプしてその移動量に応じてカメラを回転させると感覚通りの挙動をする。
 そこでタッチの移動距離を取得する関数がScreenTransformGestureのDeltaPositonである。DeltaPositionで前フレームと現在フレームの差分をVector3で取得できる。今回はオイラー角に代入してカメラを回転させるため、この数値をオイラー角に足し続ける必要がある。仮にこの処理を行わない場合は、オイラー角がDelataPositonで取得したVector3の値になるので微小の回転を繰り返すだけになる。また、Transform.eulerangleは360度以上の回転を加えると増加させるのに失敗するため、あらかじめMathf.Clampや回転させる場合の条件をつけて回転の上限を設ける必要がある。
 RotateにDeltaPositonを加えて回転させることも可能である。その場合はDeltaPositionで取得したx,yの値をそのまま使う。
 

//  CameraController.cs
//  https://skeyll.hateblo.jp/entry/camera_rotate_TouchScript
//
//  Created by Skeyll on 2019.06.20.


using System; //EventHandlerに必要
using UnityEngine;
using System.Collections;
using TouchScript.Gestures.TransformGestures; //ScreenTransformGestureに必要
using TouchScript.Gestures.TransformGestures.Base; //DealtaPositionに必要

 

public class CameraController : MonoBehaviour
{
    [SerializeField]
   ScreenTransformGesture transformGesture;
    
 //回転させるオブジェクト。
 [SerializeField]
    Transform controlObject; 
  
  //タッチ入力分だけしか回転させないなら必要ない。
    float rotateSpeed = 20.0f;
   
 //カメラの回転に制限をつけないなら必要がない。
 //この場合は左右110度までしか回転せず、方向転換はできない。
  [SerializeField]
    float limitRotateX = 110.0f, limitRotateY = 90.0f;
    float startRotateX, startRotateY;

    void Start()
    {
        startRotateX = controlObject.transform.rotation.eulerAngles.x; 
        startRotateY = controlObject.transform.rotation.eulerAngles.y;
    }

    void OnEnable()
    {
      transformGesture.Transformed += OnRotating;
    }

    void OnDisable()
    {
       transformGesture.Transformed -= OnRotating;
    }

    void OnRotating(object sender, EventArgs e)
    {
        Vector3 deltaPos = transformGesture.DeltaPosition;
        float rotateX = deltaPos.x * rotateSpeed;
        float rotateY = deltaPos.y * rotateSpeed;

       //transform.eulerAnglesに直接座標を指定してるのでここがなければ常にdeltaの座標を向くようになる。
        startRotateX = startRotateX + rotateY;
        startRotateY = startRotateY + rotateX;
 
       controlObject.transform.eulerAngles = new Vector3(Mathf.Clamp(-startRotateX, -limitRotateX, limitRotateX), Mathf.Clamp(startRotateY, -limitRotateY, limitRotateY), 0);
 }
}



3.回転させるオブジェクトにスクリプトをアタッチ

  LayerとGestureをつけたオブジェクトにCameraControllerをアタッチする。その後、CameraControllerにインスペクタ上からGestueと回転させるオブジェクトを入れる。カメラを回転させる場合は以上で回転させられる。もし回転させる対象をプレイヤーなどのオブジェクトにした場合は、カメラをそのオブジェクトの子に設定し、オブジェクトの回転にカメラを追従させる必要がある。

 もし、移動パネルなどを作りそのパネル上でスライドした移動量でカメラを回転させたい場合はTransformGestureで1ー3と同様のことをする。その場合は新たにFullScreenLayerをアタッチする必要はない。


参考
ScreenTransformGesture Class
http://touchscript.github.io/docs/html/T_TouchScript_Gestures_TransformGestures_ScreenTransformGesture.htm
UnityEngine.Transform - Unity スクリプトリファレンス
https://docs.unity3d.com/ja/2018.2/ScriptReference/Transform.html
C# - Unityで回転制限をつけたいです。|teratail
https://teratail.com/questions/83342

プライバシーポリシー - The GOD AIM

プライバシーポリシー

 私は「The GOD AIM」でいくつかの外部サービスを利用しており、それにともないプライバシー情報を収集しています。私は本アプリご利用になる皆様の情報を以下のように取り扱うものとします。また、これらの情報は法令によって提供を求められた場合、もしくはアプリの運営を委託、譲渡する場合を除いて第三者に提供することはありません。

1.取得情報

外部ストレージ(SDカード)へのアクセス
取得目的:ユーザーの設定(リコイルや感度)を保存

2.お問い合わせに関する情報

 お問い合わせにより知りえたあなたの情報はアプリの改善のためだけに使用します。問い合わせに関して返信することがあるかもしれませんが、改善以外の目的では使用しません。もし、送信したメールの削除依頼があれば速やかに削除します。

3.利用している外部サービス

 私は本アプリの提供や利用に関する動向調査、利用者に適切な広告表示をするために、以下の外部サービスを利用しています。

Unity Analytics
提供者:Unity Technologies
利用目的:アプリのクラッシュ情報の調査、利用状況の確認

AdMob
提供者:Google
利用目的:アプリ内での広告掲載

4.利用者情報の送信停止

 外部サービスはネットワークに繋がった状態で本アプリを遊んでいるときに情報を収集しています。もし、情報の送信を停止したい場合は機内モードにして利用してください。

5.ポリシーの変更

私はプライバシーポリシーの全部または一部を変更することがあります。重要な変更がある場合は告知し、このページに掲載します。

6.お問い合わせ先

 プライバシーポリシーに関するお問い合わせはコンタクトにあるSNSを通じて行うか、アプリ内、アプリ説明欄に記載しているメールアドレスから連絡してください。


制定:2019年8月11日
改定:2019年9月02日

プライバシーポリシー  ©Skeyll 2019- All Rights Reserved.