[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
制作に当たって下記のサイトさまを参考にさせて頂きました。
http://www.ne.jp/asahi/music/marinkyo/matematiko/kurbo.html.ja
https://r-dimension.xsrv.jp/classes_j/sine_cosine/
メモ:曲線のプログラムを色々試したので忘備録。
— kt. (@xxxx_kt_xxxx) December 24, 2022
八の字
float A1 = 8f;
float ds = 0.5f;
x = A1 * Mathf.Sin(rad) * ds;
y = A1 * Mathf.Sin(rad * 2) * ds;
rad += 0.02f;
(続#Unity #gamedev pic.twitter.com/qQScFjUaeW
アステロイド、A2A3の値を変えると色々変化
— kt. (@xxxx_kt_xxxx) December 24, 2022
float A1 = 4f;
float A2 = 1f;
float A3 = 1f;
x = A1 * Mathf.Pow(Mathf.Cos(rad * A2), 3);
y = A1 * Mathf.Pow(Mathf.Sin(rad * A3), 3);
rad += 0.02f;
(続 pic.twitter.com/gQisj5JBJb
リサジュー。w1, w2, p1, p2の数値を変えると図形が変化
— kt. (@xxxx_kt_xxxx) December 24, 2022
float A1 = 4f;
float A2 = 4f;
float w1 = 2f;
float w2 = 3f;
float p1 = 0f;
float p2 = 0f;
x = A1 * Mathf.Sin(w1 * rad + p1);
y = A2 * Mathf.Sin(w2 * rad + p2);
rad -= 0.01f;
(続 pic.twitter.com/YrPiDJdCBx
サイクロイド
— kt. (@xxxx_kt_xxxx) December 24, 2022
ds = 0.9f;
float A1 = 0.4f;
x = A1 * (rad - Mathf.Sin(ds * rad));
y = A1 * (1 - Mathf.Cos(ds * rad));
rad += 0.1f;
(続 pic.twitter.com/DcuyuaecDJ
トロコイド(A1 = A2の時にはサイクロイドになる)
— kt. (@xxxx_kt_xxxx) December 24, 2022
ds = 0.9f;
float A1 = 0.4f;
float A2 = 0.8f;
x = A1*(rad) - A2* Mathf.Sin(rad);
y = A1 - A2* Mathf.Cos(rad);
rad += 0.1f;
(続 pic.twitter.com/Rl1nAX9Yfj
内サイクロイド
— kt. (@xxxx_kt_xxxx) December 24, 2022
ds = 0.5f;
float A1 = 5f;
float A2 = 1f;
x = ((A1 - A2) * Mathf.Cos(rad * 1 * ds)) + (A2 * Mathf.Cos((((A1 - A2) / A2) * rad)));
y = ((A1 - A2) * Mathf.Sin(rad * 1 * ds)) - (A2 * Mathf.Sin((((A1 - A2) / A2) * rad)));
rad += 0.02f;
(続 pic.twitter.com/afwRuJIi8V
内トロコイド(A2 = A3内サイ)
— kt. (@xxxx_kt_xxxx) December 24, 2022
ds = 0.5f;
float A1 = 5f;
float A2 = 1f;
float A3 = 2f;
x = ((A1 - A2) * Mathf.Cos(rad * 1 * ds)) + (A3 * Mathf.Cos((((A1 - A2) / A2) * rad)));
y = ((A1 - A2) * Mathf.Sin(rad * 1 * ds)) - (A3 * Mathf.Sin((((A1 - A2) / A2) * rad)));
rad += 0.02f;
(続 pic.twitter.com/7H4HOi4Zyi
外サイクロイド(A1=A2とした曲線はネフロイド)
— kt. (@xxxx_kt_xxxx) December 24, 2022
ds = 0.5f;
float A1 = 3f;
float A2 = 1f;
x = ((A1 + A2) * Mathf.Cos(rad * 1 * ds)) - (A2 * Mathf.Cos((((A1 + A2) / A2) * rad)));
y = ((A1 + A2) * Mathf.Sin(rad * 1 * ds)) - (A2 * Mathf.Sin((((A1 + A2) / A2) * rad)));
rad += 0.02f;
(続 pic.twitter.com/A8qxV8wEHX
外トロコイド(A2 = A3外サイ)
— kt. (@xxxx_kt_xxxx) December 24, 2022
ds = 0.5f;
float A1 = 2f;
float A2 = 1f;
float A3 = 2f;
x = ((A1 + A2) * Mathf.Cos(rad * 1 * ds)) - (A3 * Mathf.Cos((((A1 + A2) / A2) * rad)));
y = ((A1 + A2) * Mathf.Sin(rad * 1 * ds)) - (A3 * Mathf.Sin((((A1 + A2) / A2) * rad)));
rad += 0.02f;
(続 pic.twitter.com/TiiobZr6YQ
レムニスケート
— kt. (@xxxx_kt_xxxx) December 24, 2022
ds = 0.5f;
float A1 = 5f;
x = A1 * Mathf.Cos(rad * ds) / (1 + Mathf.Pow(Mathf.Sin(rad * ds), 2));
y = A1 * Mathf.Sin(rad * ds) * Mathf.Cos(rad * ds) / (1 + Mathf.Pow(Mathf.Sin(rad * ds), 2));
rad += 0.05f;
(続 pic.twitter.com/QUeG0T96oQ
カーディオイド
— kt. (@xxxx_kt_xxxx) December 24, 2022
ds=0.2f;
float A1 = 3.5f;
x = (A1 * (1 + Mathf.Cos(rad * ds)) * Mathf.Cos(rad * ds));
y = (A1 * (1 + Mathf.Cos(rad * ds)) * Mathf.Sin(rad * ds));
rad += 0.1f;
(続 pic.twitter.com/9cs3s4E4SJ
バイフォリウム
— kt. (@xxxx_kt_xxxx) December 24, 2022
ds = 0.1f;
float A1 = 20f;
x = A1 * Mathf.Sin(rad * ds) * Mathf.Pow(Mathf.Cos(rad * ds), 3);
y = A1 * Mathf.Pow(Mathf.Sin(rad * ds), 2) * Mathf.Pow(Mathf.Cos(rad * ds), 2);
rad += 0.1f;
(続 pic.twitter.com/wTV0Mlda1C
バラ曲線(A1とA2を変化させると良い)
— kt. (@xxxx_kt_xxxx) December 24, 2022
ds = 0.2f;
float A1 = 2;
float A2 = 1;
float A3 = 6;//全体の大きさ
x = A3 * (Mathf.Sin((A1 * rad * ds) / A2) * Mathf.Cos(rad * ds));
y = A3 * (Mathf.Sin((A1 * rad * ds) / A2) * Mathf.Sin(rad * ds));
rad += 0.1f;
(続 pic.twitter.com/R1TXULhmYJ
バラ曲線(A1とA2を変化させると良い)
— kt. (@xxxx_kt_xxxx) December 24, 2022
ds = 0.2f;
float A1 = 2;
float A2 = 3;
float A3 = 6;//全体の大きさ
x = A3 * (Mathf.Sin((A1 * rad * ds) / A2) * Mathf.Cos(rad * ds));
y = A3 * (Mathf.Sin((A1 * rad * ds) / A2) * Mathf.Sin(rad * ds));
rad += 0.1f;
(続 pic.twitter.com/ZuS4ZqB76c
バラ曲線(A1とA2を変化させると良い)
— kt. (@xxxx_kt_xxxx) December 24, 2022
ds = 0.2f;
float A1 = 5;
float A2 = 2;
float A3 = 6;//全体の大きさ
x = A3 * (Mathf.Sin((A1 * rad * ds) / A2) * Mathf.Cos(rad * ds));
y = A3 * (Mathf.Sin((A1 * rad * ds) / A2) * Mathf.Sin(rad * ds));
rad += 0.1f;
(続 pic.twitter.com/bi3BCkzG8S
螺旋
— kt. (@xxxx_kt_xxxx) December 24, 2022
ds = 0.4f;
float A1 = 0.1f;
x = A1 * rad * Mathf.Cos(rad * ds);
y = A1 * rad * Mathf.Sin(rad * ds);
rad += 0.1f;
(終 pic.twitter.com/xtQm9Fj1VC
(書いてる筆者はド素人ですので色々間違っている可能性あります)
大前提としてSteamworks.NETをUnityにインストールしておいて下さい。
インストール方法は
https://ktstg.blog.shinobi.jp/Entry/1011/
で書いています。
当初は実績なんて無くても良いかなーと思っていたのですがゲームリリース後に実績目的で遊ぶ人もいるので実装した方が良いよとアドバス受け実装してみました。
ランキングと比べると実績の実装は簡単なのでやってみても良いと思います。
実装にあたり
Steam実績を実装する(Steamworks側設定編)
Steamの実績をUnityで実装する【Unity】【Steam】
コチラのサイトさんを参考にさせて頂きました。
まずはSteamworks管理画面のデータ&実績から実績を開きます。
実績にはクリアで達成などのオンオフのみで実装できる実績と、100万点とったら実績といった数値データが必要な実績があると思います。
これの数値データが必要な実績で何%まで達成みたいな表示を行いたい時は「データ&実績」のデータ画面でデータを先に作る必要がありますが今回は使わないので書きません。
(上記参考サイトさんで解説されています)
逆にオンオフのみで達成出来る実績の場合はデータを作る必要はなく実績の方だけ作れば良いです。
まずは実績アイコンを作ります。
実績アイコンは256x256のjpg画像が推奨されていますが実際に表示される時は凄く小さく表示されるので最少サイズの64x64くらいで表示されると思って作った方が良いです。
取得していない時のアイコンは取得している時のアイコンをモノクロにした物にします。
こんな風に作りましたが、実際の画面では全然文字が読めませんでした(笑)
実績画面で実績の項目を作っていきます。
新しい実績ボタンをクリックすると実績作成の項目が出てきます。
それぞれの意味は
API名:Unityでプログラムなどから指定する時の名前
進行状況:オンオフのみの実績なら「なし」最小値/最大値も0で良い。何%まで達成の表示を行うときはデータ画面で作成したAPI名を選択して最小値/最大値を入力する
ディスプレイ名:実績の名前。Steamクライアントなどで表示される実績名です。
説明:ディスプレイ名の下に表示させる実績の説明(「ステージ1をクリアした」みたいな感じ)
設定:データを修正できる人を設定
Client / ゲームアプリから更新(基本はコレを選択する)
GS / 自分でサーバーを立ててソコから更新する
Offical GS / Steamゲームサーバーから更新する
非表示?:獲得するまで表示しない(隠し実績)
達成アイコン:実績解除後のアイコン(カラー推奨)
未達成アイコン: 実績解除前のアイコン(白黒推奨)
以上をそれぞれ埋めていきます。アイコンは設定してもすぐに反映されません。途中で一度保存してから再度読み込むと上手くアップロード出来るようです。
@Unityへの実装
まずはスクリプトの最初にusing Steamworks;を記述します。Steamクライアントも起動させておかないとエラーになります。
実績解除の流れとしては
1.SteamManager.Initializedで初期化
と言った感じ
実際の実績解除はこんな風に書いています。
あと、すべての実績を解除した時の実績を作りたいなと思ったので
SteamUserStats.GetAchievement("作成したAPI名", out bool);で解除した実績を調べられる(trueだと実績を解除している)ので全ての実績を調べて解除するようにしました。
@実績のローカリゼーション
作った実績を色々な言語にローカリゼーションしたい時はSteamworks管理画面のデータ&実績から実績のローカリゼーションを選択します。
作成したい言語にレ点を入れて保存。
ALL Languagesを選択してローカリゼーションデータをダウンロードします。
ダウンロードしたデータをテキストエディタ等で開きます。
設定したい言語の所が空白になっているので埋めて上書き保存します。
保存したファイルを選択してアップロードすればOK
実績画面に戻ると言語が選択出来るようになっています。
これで上手く出来るはずなんですが自分の場合は日本語だったからか上手く反映出来なくて、結局実績を作成する画面のEditで一つづつ更新しないと駄目でした。
オンラインランキングを実装する流れとしては
①Steamworks管理画面にランキングを作成
②Steamworks.NETをUnityにインストール
③UnityにてオンラインランキングをC#で実装
といった感じになります。
実装にあたり
Steamのランキング(リーダーボード)をUnityで実装する【Unity】【Steam】
Unity製ゲームで、Steamのランキング実装をするには
コチラのサイトさんを参考にさせて頂きました。
①Steamworks管理画面にランキングを作成
Steamworks管理画面のテクニカルツールにあるSteamworks設定編集→データ&実績→ランキングを選択します。
ランキングを追加で任意の名前を付けて作成します。
パラメータの内容はSteamworksの説明から抜粋
書き込みと読み込みは特別な事をしない限りは設定する必要なさそうです。
並べ替え方法1位から順番に表示したい場合は降順にします。
実施したいランキングの数だけ作成します。
(例えばイージーとノーマルとハードに分けたかったら3個作る)
ランキングを作成したらココでの設定は終了です。
②Steamworks.NETをUnityにインストール
アセットストアにもあるみたいですが公式の?Githubからダウンロードするのが良さげ
Releases · rlabrecque/Steamworks.NET
ちょっと下にあるSteamworks.NET_20.1.0.unitypackageをダウンロードしてAssets→Import Package→Custom Packageでインストールします。
インストールしたらゲームプロジェクトフォルダの一番上の階層にsteam_appid.txtがあると思うので、それを開くのですがUnityからは見えないのでWindowsからテキストエディタで開きます。
初期は480?かと思いますので、自分のゲームのID(Steamworksに表示されているゲームタイトルの横にある数字)を入力して保存します。
保存したらココでの設定は終了です。
③UnityにてオンラインランキングをC#で実装
※オンラインランキングを使用するときはUnityと同時にSteamも立ち上げておかないとエラーが出るので注意が必要です。
ランキング送受信する時のC#スクリプトはこんな感じ
リーダーボードの取得
ランキングの取得
スコアの送信
流れとしてはリーダーボードを取得してランキング取得して表示もしくは送信を行うだけなので、ランキングの取得とスコアの送信が出来れば何とかなる感じです。
取得した順位はテキストなどに入れて表示すればランキング表が出来ます。
ただ、あまり頻繁に取得すると表示制限?が掛かるみたいで取得出来なくなるので、あまり更新頻度は上げない方が良さそうです。
アルゴリズムを検索してみてもあまり出てこなかったので忘備録として書いておきます。テトランっぽい敵を作ってみてる。とりあえず腕を増やしまくるのはお約束w#Unity #gamedev pic.twitter.com/PGah4rCxqx
— kt. (@xxxx_kt_xxxx) February 6, 2022
考え方としては
1本目、腕の中心から決めた角度の腕の長さの円を描ける座標計算をします。その計算した座標を2本目の中心座標とします。
2本目、1本目で計算した中心座標から決めた角度の腕の長さの円を描ける座標計算をします。その計算した座標を3本目の中心座標とします。
3本目、2本目で計算した中心座標から決めた角度の腕の長さの円を描ける座標計算をします。その計算した座標を4本目の中心座標とします。
以下腕の長さだけ繰り返し。
要は普通に多関節の腕を作る感じです。
このまま回転させてもファンタジーゾーンのウインクロンみたいな感じで腕は真っすぐのままなのですが、ここで各腕に回転させる角度を一定の間隔で少しづつずらしてプラスするとテトランのようにウネウネする感じで回転してくれます。
ソースだとこんな感じ。
中心の腕が親、続く腕が子というイメージです。
**************************************************************
Vector3 pos1 = transform.position;
//1本目の計算
キーボードQボタンを押すと腕がウネウネする。
**************************************************************
初期設定時にradの値を0~6.28の間で設定すれば好きな向きに腕を伸ばす事が出来ます。
上記を纏めるとこんな感じ。
**************************************************************
float rad_plus = 0.05f
Vector3 pos1 = transform.position;
腕の画像は下記画像のような中心から外側に向かうような画像にしておかないと上手く腕が繋がりません。
考え方としては画像を1ドットづつのスプライトに分割してサインカーブに合わせて動かす感じ。Unityでスプライト使ってのラスタースクロールを実装してみた。1ラインづつ分けて動かしてるので疑似ラスタースクロールだけどねー#Unity #gamedev pic.twitter.com/OoKyCNLgpz
— kt. (@xxxx_kt_xxxx) October 26, 2021
まずはラスタースクロールさせたい画像を用意します。
今回は768x128ドットの画像を使いました。
画像を選択したらInspectorのSprite ModeをMultipleに変更してからSprite Editorをクリックします。
追加した画像の再生マークを押すと
round01_0
round01_1
round01_2
round01_3
round01_4
round01_5...
みたいな感じで画像が追加されていると思います。
Hierarchyタブで右クリックから空のゲームオブジェクトを作成します。Round01と言う名前にしました。
追加された画像を全て選択して、作成したゲームオブジェクトにドラッグします。この時そのままドラッグするとアニメ作成画面になるのでAltを押しながら追加すると子として登録されます。
これでRound01という親オブジェクトに1ドット毎に128個の分割された子オブジェクトが追加されました。これを親オブジェクトから操作して行きます。
まずC#スクリプトを作成してRound01のアタッチします。
Round01のスクリプトはこんな感じ
*******************************************
*******************************************
sp,sindou,habaの数値を色々変更すると動きが変わります。
02 | 2025/03 | 04 |
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
好きなSTGは、怒首領蜂大往生、エスプガルーダ(2)等の弾幕STGやら雷電シリーズなんかの非弾幕、バトルガレッガ、グラディウスシリーズ、R-TYPE等、STGなら何でも好きです。
音楽がカッコイイSTGが特に好きで、並木学氏は最高!