ゆーとぴあ。ブログ

技術の備忘録や、日記などを投稿します

【Unity】複数のImageAnchorを管理できる拡張メソッド【ARImageAnchorExtensions】

概要

ARKitのサンプルでImageAnchorの管理が1種類しかできなかったものを複数種類できるようにした拡張メソッド

使用方法

GenerateImageAnchorをアタッチしていた部分をARImageAnchorExtensionsに変更
※その他マーカー検出にはARKitの導入からARReferenceImageの設定等行う必要があります。詳しくはUnity AR Pluginで調べてみてください。

まとめ

研修でARの研究をしている中でマーカーやImageAnchorを管理するものが欲しいということで拡張メソッドを作りました。
気が向いたら現実世界のオブジェクト単位で検出できるObjectAnchorの拡張もしてみたいです。

【C#】意外と知らない名前付き引数

C# 4.0から追加されたオプション引数と名前付き引数ですが、あんまり使われているところを見たことがなかったため意外と知らないのでは?と思い紹介することにしました。

オプション引数

C++でもあったデフォルト引数とも呼ばれるものです。
オプション引数が設定されているメソッドは、その引数を指定しなくても設定されたデフォルトの値で処理してくれるというものです。

void Hoge(int fuga = 0) {
    Debug.Log(fuga);
}

名前付き引数

設計によっては、メソッドの引数にこれとこれとこれとこれとこれを設定!みたいなのもあると思います。
ですがそういった場合、最後の値を設定したい場合全ての引数を記述しなければなりません。
そういった場合に使えるのが名前付き引数です。

private void Start()
{
    Hoge(fuga: "abc", isHogeHoge: true);
}

private void Hoge(int hoge = 0, string fuga = "a", bool isHogeHoge = false)
{
    Debug.Log(hoge);
    Debug.Log(fuga);
    Debug.Log(isHogeHoge);
}

もちろん、オプション引数が設定されていない引数は必須なので、全て記述する必要がありますが、上記のようなこの引数はデフォルトでいいけど、
後の引数は設定したいといった場合は、名前付き引数を用いて明示的にこの引数はこれっていうのを設定してあげれば大丈夫です。

まあこのような設計をそもそもしないというのが名前付き引数が使われてない一つの理由かもしれませんね...

【雑記】配属が決まりました!

僕の勤めている会社で先日配属が決まったので、意気込み等含めて久しぶりに雑記を書こうと思います。

 

今まで、内定しました!や入社しました!などサラッと言うことはありましたが、改めてこういったアウトプットの場で報告したことがなかったため、これからゲーム業界を目指す後輩たちのためにも会社の紹介をします。

 

株式会社サイバーエージェント

www.cyberagent.co.jp

僕の入社したサイバーエージェント(以下:CA)は、広告・メディア・ゲーム・スタートアップ等様々な事業を展開している会社で、「21世紀を代表する会社を創る」というビジョンを掲げており、とにかく若者が活躍している会社です。100社以上の子会社があるCAですが、実際にどの会社も20代〜30代前半の年齢層が多くを占めています。中では、内定者の段階で会社を立ち上げ社長をやっている人もいます。

CAの特長として、会社内での異動やPJの異動を含め積極的にやりたいことや挑戦したいことをどんどんアピールしていけばその意思を尊重していただき比較的なんでもやらせてくれます(もちろん各子会社やPJの現在の状況(アプリリリース直前など)によってもタイミングや可能不可能は変化します)。なので個々の熱意やチャレンジ精神があればあるほど、自走力や成長が伴っていく会社だと思っています。会社の良いところはたくさんありますが、僕がCAを志望した1番の理由はこれです。

ちなみに僕の生まれ年である1998年に設立された会社です。

 

SGE

creator.game.cyberagent.co.jp

続いて、僕の配属された「SGE」(Smartphone Game & Entertainment)という組織についてです。SGEはその名の通りゲーム事業を行っていて、ポコダンやガルパ等々有名なスマホゲームを数多く開発しています。

また、今年は昨年の東京ゲームショウでも発表された「Kick-Flight」「リンクスリングス」「BLADE X LORD」などリリースを予定している新規タイトルもあり、今年の新卒にとって非常に良い経験ができると思うので、とてもワクワクしています。

 

意気込み

SGEに配属になりましたが、SGE内での研修後(5/20〜予定)各子会社へ配属され実際の現場で働くことになります。

まず僕が現在目指している一つの大きな目標として、SGEのQ初会で新人賞をとることです。

Q初会というのは、3ヶ月に1回ある(QはQuarterのQ)SGE全体が集まるものです。なぜCA全体の新人賞ではなくSGEでの新人賞なのか?ということですが、もちろん、会社全体で表彰されるような仕事をしたいと思っています。ですが、ゲームエンジニアとして第一に認めてもらう必要がある組織といったらSGEだと思いました。

大きな目標を達成するまでの過程が大事だと思っていて、その過程がブラックボックスだと思うように目標と行動が伴わず空回りする可能性があります。なので、今僕が考えている過程は、

子会社の中でトレーナーの方が放置してても大丈夫と思われるような自走力をつける

余裕が出てきたらSGEの他の会社とも横軸組織などで少しずつ交流をもつ

SGEの全体で19のぐっちーめっちゃ頑張ってるやんと思われるようになる

Q初会で新人賞をとる

です。

ぶっちゃけこれでも具体的にどうやって実現するかをはっきりわかっているわけではないのでブラックボックスと言われればブラックボックスなのですが、多少曖昧でも目の前の目標を一つずつ達成していくことで大きな目標を達成できると思っています。

とはいえ新卒なので思うようにいかないことが多いと思います。現在進行形で新卒の特権である色々な先輩社員方にたくさん話やアドバイスを聞くということをやっているので失敗を恐れずどんどん聞いてどんどん行動して半年、1年先の自分が急成長できているように頑張りたいと思います!

 

最後に宣伝

kickflight.grenge.jp

TwitterFacebook等で見てくださった方はご存知かと思いますが、僕が昨年夏に内定者アルバイトをしていてかつ配属希望の、株式会社グレンジの新作「Kick-Flight」が事前登録受付中です!先行テストプレイも募集しており、成績優秀者には超豪華な賞品もあるので皆さん是非とも事前登録と情報の拡散をよろしくお願い致します!

【Unity】ドンキーコングシリーズギミック実装してみた:バナナをつかめ!編【4】

今回はドンキーコング3のボーナスの一つである「バナナをつかめ!」を作りました!

github.com

 

バナナをつかめ!

ãããããã¤ããããã³ã­ã¼ãã®ç»åæ¤ç´¢çµæ

スーパードンキーコング3に初めて登場したボーナスです。

制限時間内に指定された数の緑色のバナナを取得するというミニゲームで、各ステージのギミック(タルの上で・雷を避けながら・スコークスで など)の攻略にプラスで集める必要があり、さらにはバナナは一定時間経つと消えてしまうというスピードとスキルが求められる内容になっています。

実装したもの

f:id:gucchi0204:20190419151950g:plain

サウンドとプレイヤー、ボーナスin時のカット等は実装していません

 

ポイント

  • 指定した座標にランダムで出現する
  • 集め終わったら(条件を達成したら)ちゃんとボーナスコインを出す

 

これまで作ったものの応用で作れたので実装はそんなに時間がかからなかったです!一定時間経ったら点滅して消えるという処理をasync/awaitでやっていたため、先週あげた記事(【Unity】Taskのキャンセル処理を楽に行う拡張メソッド【AwaitTriggerExtensions】)の部分で苦戦したくらいでしたね。

次回もお楽しみに!

 

【Unity】Taskのキャンセル処理を楽に行う拡張メソッド【AwaitTriggerExtensions】

概要

オブジェクトが削除または非アクティブになった際にasync/await処理が動き続けるのをキャンセルする拡張メソッド(自作)

使用例

[SerializeField]
private AwaitTriggerExtensions _awaitExt;

private async Task Hoge()
{
    Debug.Log("開始");
    await _awaitExt.CancelableAsync(CoroutineMethod(() => 
    {
        Debug.Log("終了");
    });
}

private IEnumerator CoroutineMethod(Action action = null)
{
    yield return new WaitForSeconds(3f);
    action?.Invoke();
}

①AwaitTriggerExtensionsをTaskのキャンセル処理を行いたいオブジェクトにアタッチ
②Action型を引数としたコルーチンを用意(遅延・終了処理用)
③任意の場所でCancelableAsyncを実行
※デフォルトでアタッチされたオブジェクトのOnDestroyが呼ばれたタイミングで自動的にキャンセルされるようになっていますが、_awaitExt.Cancel()を呼ぶことで任意のタイミングでキャンセルすることができます。

まとめ

正常にキャンセル処理は機能しますが、まだまだ納得いっていない点が多いです。
IEnumeratorのみしか使えなかったり、コールバックで終了処理を呼ぶ必要があったり(これが一番致命的でHogeのawaitが仕事をしていない😭😭😭)...
随時改善していきたいと思っているのでアドバイスがあればぜひお願いします!

【Unity】ドンキーコングシリーズギミック実装してみた:熱気球編【3】

今回はドンキーコング2の「ねっききゅうライド」より熱気球を作りました!

github.com

 

熱気球

 

ドンキーコング2の2ワールド目、マグマのどうくつ「クロコドーム」には3つのマグマステージがあります。初見の頃にとても苦戦した「しゃくねつダイビング」をクリアした後にホッと一息つけると思いきやなかなかの難易度で出てきた「ねっききゅうライド」。ここで初めて登場(このステージでしかないですが)したギミックです。

コングが乗っている場合に熱気球を動かすことができます。放っておくとだんだん落ちていきますが、ステージ内に存在する蒸気に触れると浮くため、この蒸気をつたってゴールまで進むという仕組みになります。

実装したもの

f:id:gucchi0204:20190406203145g:plain

サウンドとプレイヤー、熱気球の細かいアニメーションは実装していません

キーボードで熱気球を動かすようにしています。パーティクルとの当たり判定部分で少し挙動がまだおかしいため少しずつ調整を入れていく予定です。

 

ポイント

  • 左右の移動に一定の加速度がある
  • 蒸気に触れてない場合は落ちていく

 

この蒸気汚い。。。デザイナーの力ってすごいなって思いました。

次回もお楽しみに!

【Unity】ドンキーコングシリーズギミック実装してみた:KONGパネル編【2】

今回はシリーズ全てに登場するKONGパネルを作りました!

github.com

 

KONGパネル

KONGパネルはステージの進捗を表しているもので、ゴールに近づくごとにK→O→N→Gと配置されています。全てあつめると1upすることができます。

ボーナスやDKコインとは違って、ほとんどのパネルは隠されておらず普通に進んでいけば回収できるようになっています。

 

実装したもの

f:id:gucchi0204:20190330150728g:plain

サウンドとプレイヤーは実装していません

 

ポイント

  • 画像では順番に取っているが順番でなくても取得可能になってます
  • 取得したときしかパネルのUIを出さないなど細かいアニメーション
  • 全て取得したときのアニメーション

簡単に実装できるやろ〜〜と休憩の気分でやってたら意外と苦戦しました。

まだまだ細かい点は残っていると思うのでしっかり再現できたらいいなと思ってます!

次回もお楽しみに!