サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
アメリカ大統領選
developer.aiming-inc.com
ソフトウェアエンジニアの後藤です。 今回は私が所属するプロジェクトで行った、ゲームロジックのクラスライブラリ化について紹介します。 経緯 開発初期にゲームの戦闘パートなどの、所謂「メインゲーム」を Unity のプロジェクト内に実装していました。 しかし開発が進むにつれて、 Unity を使わずにメインゲームを動かしたい場面が出てきました。その例を以下に挙げます。 AI に1000回バトルさせて勝率を記録する サーバに送られたログから戦闘を再現できるか検証し、ユーザーがチートしているか調べる これを実現するため、メインゲームの機能を Unity から分離して他のアプリケーションでも利用できるようにしました。 目的・問題設定 サンプルとして簡素なRPGの戦闘パートを作成しました。 [ゲームルール] ■キャラクターは「味方」と「敵」のチームに分かれる ■素早さが高い順に1人ずつ、誰かに攻撃する
こんにちは、そして、お久しぶりです。 Aiming の土井です。 今年はファミリーベーシック40周年だそうです。小学生の頃に触れて、ゲームのプログラムを書く仕事を志したという思い出があり感慨深いですね。年齢は秘密です! 今回は「C# Source Generator の作り方」について書いていきます。 ソースジェネレーターとは ソース ジェネレーターとは、.NET Compiler Platform (“Roslyn”) SDK で提供される、「コンパイル時コード生成機能」です。自動生成されたソースコードは、裏側に隠れ、生成コードを使用していることを意識せず、動的なコード生成による柔軟な実装を行うことができるようになります。 ソースジェネレーターは、アセンブリ単位毎に、コードに変更が入ったタイミングで動作し、任意のコード生成処理を実装することができます。 ユースケース 外部 DLL を参照
原因調査 エラーの発生箇所の特定 このエラーIncorrect datetime valueはデータベースのdatetime columnに対して不正な値を書き込もうとしたことが原因で発生しています。通常のINSERT statementを使って、過去の時刻を書き込むことはほとんどありませんが、MySQLなどに用意されているINSERT … ON DUPLICATE KEY UPDATE statementを使って複数の行を更新するときには、過去の時間を使ったクエリが生成されます。 例えば、複数の消耗品を所持しており、1つのクエリで複数の所持数を変更するときは、下記のようになります。 // PK(user_id, item_id) SELECT * FROM items WHERE user_id = 123; user_id | item_id | quantity | created_
本を買いました。 私の所属する Aiming 第1事業部はオフィスが手狭になったことから、昨年、隣のビルに事業部ごと引っ越しました。 その際、多くの書籍を旧オフィスに残したため、新しいオフィスの本棚は現在空っぽの状態です(隣のオフィスに行けば読むことはできますが)。 現在、第一事業部では週に n 日出社し、残りの (5 – n) 日は在宅勤務するというハイブリッドな勤務体制を採用しています。 コロナ禍のフルリモート時代と比較して、オフィスにいる時間が増えたため、エンジニアにとって必読の書籍を選んで購入しました。 なるべく、定番となりそうな書籍を選びました。 壁全面の大きな窓で開放感のあるオフィスです。 コーディング、コード設計 リーダブルコード 良いコードとはどんなものでしょうか。 実行処理が短いことだったり、文字数が少ないことが正義だったりと、その判断をする価値基準は現場における要件やメ
こんにちは! 第2事業部エンジニアの佐久間です。 今回はあるプロジェクトのレンダリングパイプラインをビルトインからURPに移行したので、それについて話させて頂きます。 対象読者 ・ビルトインからURPにレンダリングパイプラインを移行予定の方 ・URPにすることで実際どのくらい負荷が軽減するのかが気になる方 URPとは URP(Universal Render Pipeline)とは、Unityが提供しているレンダリングパイプラインのひとつになります。 Universal Render Pipeline overview 移行に至った経緯 開発中のプロジェクトで、ある程度リソースがある状態でしたが、移行に踏み切りました。 理由としては、以下になります。 ・SRP Batcherの有効化 ・Shader Graphの使用ができる ・Render Featureによるレンダリングパスのカスタマイ
[C#の黒魔術 IL Weaving] Unity で AOP(アスペクト指向プログラミング) をしよう 2022.09.13 Unity プログラミング C#, Unity, エンジニア, 第1事業部 土井 英範。TWILO(第1事業部) エンジニアマネージャ。Unity を中心とした開発をやってきました。エディタ拡張を書くのが大好きです。好きなゲームはマインクラフトです。好きな言語はC#、キーボードは Majestouch のスピードシルバー軸を使っています!(変態キーボードは使ってません。ドノーマルなエンジニアです) アスペクト指向プログラミングとは ログの出力や、プロファイリングのためのコードは、プログラム全体に広く記述されますが、これらは共通したロジックであるにも関わらず、同じようなコードパターンが関数毎に記述されています。 コードが大きくなっていくと、個別に記述された似たような
第1部:在宅勤務開始から現在までの軌跡 在宅勤務への移行 2020年2月中旬、新型コロナウイルスが日本でも問題になり始めたのがこの時期だったと思います。 まだ、多くの人々が、ここまでおおごとになるとは思っておらず、緊急事態宣言という言葉も出てなかった頃ではないでしょうか。 このタイミングで会社から、可能なプロジェクトは在宅勤務に移行するようアナウンスが出ました。日本の会社の中でも、比較的早いタイミングで在宅勤務への切替の判断をしたと思います。 それだけに、当時は在宅勤務に関する情報は今ほど出回っておらず、どのような問題やリスクがあるのかが分からない状態で、そもそも在宅勤務で本当に仕事が上手く回るのかが分からなかったというのが正直なところでした。 在宅勤務切替の判断 そのように情報不足な状況であったことに加え、第1事業部の某プロジェクトではクローズドβテストを間近に控えていたこともあり、容易
こんにちは! サーバーエンジニアの吉田です。 私は今まで、いろんなゲームのバトルシステムに携わってきました。そして、たくさんの失敗も経験しました。 今回はその失敗した話と、その反省からこうした方が良いよ、という話をしてみたいと思います。 ここでは、言語としてはC++を想定して書いていますが、オブジェクト指向で書けるプログラミング言語なら、同じ考え方を適用できるはずです。 こんなバトルをつくりたい まず、本題に入る前に、今回の記事で想定するバトルシステムについて、前提条件を書いておきます。 複数のキャラが同時に、リアルタイムで行動する 時間とともに、キャラの状態が変化する(例えば毒ダメージなど) あるキャラの行動が、他のキャラの状態を変化させる(攻撃、回復など) 敵キャラのHPが0になり倒されると、スコアが加算される よくある、リアルタイムバトルですね。 このようなバトルをプログラミングする
こんにちは。 Aiming ソフトウェアエンジニアの佐藤です。 みなさんは Unity で開発をしているとき、次のような経験はないでしょうか? 消しても消しても復活する meta の変更―― 他人の変更を取り込んだらリロードする度に prefab に変更が出るように―― このような、 Unity で import を走らせる度に生まれる prefab, asset, meta などの変更(以後、まとめて「reimport 差分」とします)は、プロジェクトが大規模化するほど発生しやすくなります。 私たちのプロジェクトでも度々発生し、放置されて増え続けるなどの問題も起きていました。 本記事では、この課題に対して私たちのプロジェクトで取ったアプローチについて紹介します。 なお git の利用を前提としています。 h2. reimport 差分を放置すると何が起きるのか そもそもなぜ放置して増え続
こんにちは!Aiming ソフトウェアエンジニアの栗本です。 AimingではUnityでのイベントハンドリングや非同期タスクの処理に UniRx というライブラリを使っています。 UniRxとは Rx (Reactive Extensions) という仕組みをUnityで扱うためのライブラリです。 これを使うことで、イベントと非同期タスクを IObservable という共通のインターフェースにし、 Linq と似たオペレーターを使うことができるようになります。 Rxを利用すると、従来ではコールバックの入れ子になってしまうようなコードを宣言的に記述することができるようになり、大変便利です。 正しく扱えば強力なRxですが、しかし一歩間違えば「リアクティブスパゲティ」と呼ばれる、コールバックが複雑に入り組む危険なコードを書いてしまいやすいという問題があります。 今回の記事では、この「リアクテ
こんにちは、大阪スタジオ ソフトウェアエンジニアの滝です。 今回のお話は、C#でMySQLに接続してデータを取得したり、SSH接続でコマンドの送信をやってみたお話になります。 きっかけは、業務で集計ツールを作成する機会があり、その要件は、Windows環境からターミナルを使わずに、データベース及びログサーバーからデータ集計を行い、その結果をExcelファイルに出力するというものです。 実現には様々な方法が考えられますが、今回はWindows環境から行いたいということだったため、デスクトップクライアントを作成し、アプリケーションを実行することで集計処理を自動で行ない、結果をExcelファイルに出力するようなツールを作成することにしました。 要件を満たすために、C#でMySQLに接続してデータを取得したり、SSH接続でコマンドの送信を行う必要があり、どのように実現したかを簡単なサンプルコードと
こんにちは!インフラチームの川田です。 業務では社内ネットワーク構築・運用やツールの検証などしています。 本記事では、1月末から2月初頭にかけて行ったDB検証のベンチマーク結果をまとめたいと思います。 試験環境 今回は以下4つの環境を対象にMySQL 5.7互換のあるDBを構築し、ベンチマークを測りました。 Google Compute Engine (以下GCE) Google CloudSQL Amazon EC2 Amazon Aurora サービス概要 GCE及びEC2は、仮想マシンを構築することができるサービスです。 CloudSQLとAuroraは、フルマネージド型DBサービスです。どちらも簡単なので、とりあえずDB構築してみたいという初心者にオススメです。 CloudSQLはチューニング項目はありませんが、AuroraではMySQLのmy.cnfで設定できる項目の一部を変更で
CephFSの構成図 GlusterFSの構成図 検証方法 測定するたびに必ずLinuxのcacheをpurgeする。 e.g. ) echo 3 > /proc/sys/vm/drop_caches 測定結果は3回測定した後の中央値とする。 検証結果 ddコマンドを用いて、大型のファイルを作成する時間を測定 ddコマンドを用いて、小型のファイルを大量に作成する時間を測定 アパッチベンチで100セッションを同時に送り、Request per secondを測定 Fioでのベンチマーク random writeで10MBを16個並列で作成 fio -name=r -direct=1 -rw=randwrite -bs=4k -size 10M -numjobs=16 -runtime=16 -group_reporting random readで10MBを16個並列で読み込み fio -n
こんにちは、エンジニアの佐藤です。 突然ですが、みなさんは分割キーボードをご存知でしょうか。 キーボードが真ん中で左右に分かれており、左右のそれぞれの腕に対して自然な位置・角度に設置できるキーボードのことです。 エルゴノミクスの観点からも人気の高い分割キーボードですが、高価であることや種類の少なさなどから導入ハードルは低くありません。 そんな分割キーボードの代替手段としてあるのがデュアルキーボードです。 デュアルキーボードとは、2台のキーボードを左右に並べ、左手で左のキーボード、右手で右のキーボードをタイプするスタイルのことです。 本記事では、弊社でも多くのメンバーが採用しているデュアルキーボードの魅力についてお伝えしたいと思います。 h2. デュアルキーボードの7つの魅力 h3. 身体にやさしい なんといっても分割キーボード自体の魅力である、自然な腕の角度でタイピングできることが最大の利
初めまして、エンジニアの鴛海太一です。 主にデータ分析や、その基盤ツールを作るチームに所属しています。 今回は、アプリトラッキングツールから送られてくるログをBigQueryに入れるための機構をサーバレス化した話になります。 h2. サーバレス化の目的と以前の構成 以前の構成は以下のようなものでした。 !https://developer.aiming-inc.com/wp-content/uploads/2017/10/appsflyer.png! この構成は、安定して1年ほど稼動していましたが、kubernetesの知識が必要で、メンテナンスがしにくいことが欠点でした。 h2. サーバレス化 そこで、以下の図の様なマネージドサービスを使ったサーバレスアーキテクチャを構築しました。 !https://developer.aiming-inc.com/wp-content/uploads/
Source by RubyKaigi 2017 こんにちは! Aiming ソフトウェアエンジニアの神﨑です。 Aiming は来る9月18日(月)から9月20日(水)に行われる RubyKaigi 2017 に Gold Sponsor として協賛します。 Aiming では開発基盤として Ruby on Rails を多く採用しており、 Ruby コミュニティのさらなる発展に貢献したいと考えています。 昨年は国立京都国際会館で行われましたが(昨年の報告記事)、今年の会場は広島国際会議場とのことで、おそらく参加者のほとんどの方が広島へ遠征することになるのではないでしょうか。そうなるとやっぱり調べておきたいのは広島のお土産。おすすめの広島土産がないかを広島出身の友人に聞くと、定番ものから今まで知らなかったようなものまで紹介されたので、まとめてご紹介します! もみじ饅頭 CC BY-SA
東京スタジオのエンジニアの小山です。 この記事では、5月中に行われたサーバーサイド勉強会の内容を紹介したいと思います。 サーバーサイド勉強会の紹介や4月分の内容は前回の記事を見てください。 https://developer.aiming-inc.com/study/server_side_study_201704/ 5/11 LT 月初のLTです。 OSS Contribution ラスタム秘伝の LT スライド大作戦 https://rastamhadi.github.io/slides/lt_slides_server/ (sを押すとスピーカーノートが表示されます) 仮想電子工作のすすめ https://www.slideshare.net/ckazu/ss-77687982 #slack-trend 開発記 記号でRuby 快適なオフィスの室温を巡る細やかな試論 今回は全体的に真面
エンジニアの吉野です。 先日アップデートされたばかりの AssetBundleGraphTool v1.3 をこれまた先日リリースされた Unity 2017.1 に入れてみました。 AssetBundleGraphTool の bitbucket ページ 日本語マニュアル 今回はゲームで使用する Asset がどの AssetBundle に入っているかのテーブルデータをカスタムノードで作成したのでかいつまんで紹介しようと思います。 概要 ゲームで Asset を読むときに、開発中はローカルから、実機では AssetBundle を使いたいということが良くあります。 (Unite 2017 で紹介されていた Addressable Assets が入ればいらなくなるはずなので、それまでのつなぎで…) これを満たすための仕様としては、おおむね以下の図のようになると思います。 この図の As
ゲームデザイナの水島です。 Aimingでは定期的に社内勉強会をやってます。 自分は若いプランナー向けにゲーム開発の基礎的な話をすることが多いのですが、新しいメンバーが増えてくると、何年か置いて同じ話を繰り返しすることもあります。手抜きといえばそのとおりなんですが、自分の中でも定期的に見直す良い機会だと思ってまして、今回もそんなお話です。 5年前に行った勉強会のスライド「企画が考えるスマホUIデザイン」は、現在27万viewと多くの方にみていただきました。 でもいま見返すと古いと感じるところも結構あります。当時はブラウザのソーシャルゲームからの移行期で、スマホネイティブのゲームも今ほど多く無かったため、いろいろ手探りの状態だったな~と思い出します。弊社の話でいうと、制作のパイプラインなんかは、その後だいぶ改善されたと感じてます。 そこで今回はもうちょっとテーマを絞って、UI仕様書について話
皆様,こんにちは! 株式会社Aiming の 土井と申します! リードソフトウェアエンジニアをやっております! ここ数年は,業務で Unity の uGUI を使って UI 開発をする機会が多いのですが、 Order in Layer, Sorting Layer, ヒエラルキ上の並び順……(つд⊂)ゴシゴシ Unity では重なり順を指定する項目が多いですよね。 これらの項目間の優先度が実際にどうなっているのか理解していなかったため、調査を兼ねてチートシートを作ってみました! h2. 描画優先度を指定するものを列挙してみた * Canvas の Screen Space 設定 * Order in Layer * SortingLayer * Camera の Depth 値 * Material の RenderQueue * ヒエラルキ(Hierarchy) 上の親子関係・兄弟関
はじめに 初めての人は初めまして! 前回の記事(第2回 Game Gatling LTに登壇してきました!)を見てくれてる人は、お久しぶりです! 大阪スタジオ インフラチームの菅野明洋です。 業務では、主に大阪スタジオのサービスインフラを担当させていただいております。 今回は、読書会を開いてみましたので、その話をまとめました。 読書会について 読書会は、集団で読書や読書に関するコミュニケーションを図るイベントです。 弊社では興味がある話題や本ごとに幾つかの読書会が開かれております。 開催してみた読書会について 今回は、SQLアンチパターンと言う本を題材にしております。 この本の読書会をするキッカケとしては、弊社の若手のエンジニアが最近読み始めたと言うことで話題に上がったことと、他のエンジニアと意見交換出来たら面白いと言う事で開いてみました。 読書会のルールについて 基本的に参加自由 参加者
こんにちは。Aiming エンジニアの久保田です。 僕の携わっているプロジェクトでは、近頃、Unity製クライアントのパフォーマンスの調査や改善を行っている最中です。 プロファイラを眺めていると、僕達が書くアプリケーションレイヤのコードが目立って遅い、ということは珍しいのですが、代わりにC#世界のスパイクとしてよく顔を出すのが、GC実行時間です。 C#は、タイプセーフでありながら人間にやさしく、getter/setter、async/await、Rx、ロケットなラムダ式、他他他…最新型の言語への影響も多大な、ファッション的にも◎な言語です。しかし、闇雲に全ての機能をタダで……というわけにはいかず、ことパフォーマンス面においては、GCというなかなか高い代償を支払うことになりかねないわけですね。 結論としては、UnityのGCは、皆が期待していたほど高性能ではなく、現状では僕達が書くC#が発生
はじめまして。エンジニアの石井と申します。 今回は現在担当プロジェクトで使用しているUnity(ゲームエンジン)用DIフレームワーク、Zenjectを紹介させていただきます。 Zenjectとは https://github.com/modesttree/Zenject ZenjectはUnity3D向けに作成された、DI(依存性の注入)フレームワークです。 Zenjectを使うことでオブジェクト間の依存関係を外部から解決することができます。 簡単になにが良いかを説明しますと、 依存オブジェクトを別の入れ物(コンテナ)に格納しておきコンテナ経由で使うことで、 コンストラクタやメソッドの引数で渡していたり、自身でnewしていたり、FindObjectしていた部分をなくすことができます。 Zenjectサンプル Zenjectを使ってのUIイベント処理の簡単なサンプルを作っていきます。 今回は
こんにちは。大阪スタジオ エンジニアの西村です。 Unity 5.6.0からTest RunnerにPlayModeが追加されました。以前からあったEditModeのテストではカバーできなかったフレームをまたぐ非同期処理などのテストが可能になります。ざっくり試してみた結果をまとめてみました。この記事ではUnity 5.6.0f3を使用しています。 PlayModeを有効にする 初期状態ではPlayModeが無効になっているので有効にします。まずWindow – Test RunnerでTest Runnerウィンドウを開きます。 PlayModeタブを選択すると”Enable playmode tests”というボタンがあり、これを押した後でUnityを再起動する必要があります。 これでPlayModeが使えるようになりました。 PlayModeでテストを実行してみる Create Pla
初めまして、Aimingのデザイナの板井です。 先日社内の勉強会にて、Unityを用いたエフェクト作成方法を発表させて頂きました。 内容は、Unity(3D)でのエフェクト作成未経験の方を対象としたものとなっています。 まず最初に、エフェクト作成の簡単な流れ、作成に使用するツール(particle)等の説明とその手順、そしてその機能を用いたエフェクトの作例等という構成になっております。 作例には「幻塔戦記グリフォン~新章~」で実際に作成したエフェクトも紹介させて頂きました。 今回の説明は、Aiming台湾・東京・大阪と三カ所で行わせていただきました。 この発表が、Unityでのエフェクト作成の手助けになれば幸いです。 「幻塔戦記グリフォン~新章~」公式サイト ©SEGA/©Aiming All Rights Reserved ▼▼スライド内の参考動画▼ ※Internet Explorer
Jenkins と GitHub を連携させる Webhook について GitHub と Jenkins を連携させる機能のひとつに「Webhook」と呼ばれるものがあります。この Webhook をつかうことで、 GitHub 上で管理しているリポジトリにブランチを push したときや、新たに Pull Request を作成した時などに Jenkins のジョブを走らせるといったことができます。 しかしながら、 Jenkins や Jenkins の複数のプラグインが Webhook の機能を提供しており、どの機能がどのサービスを提供しているのかがわかりづらくなっているのが現状です。そこでこのエントリーでは、それぞれの機能でどのような特徴があり、どういった設定が必要なのかを、実際に設定を行いながら整理したいと思います。 なお使用している Jenkins のバージョンはこの記事執筆時
この記事を読むのに使用する時間の目安 = 15〜20分 インフラチームの小熊です。 前回(弊社インフラチームが参考にして実践しているITサービスフレームワークや利用しているOSS, Tool類の紹介をさせていただきました。)から大分空いてしまいましたが、今回は、そのツールやOSSのTips をいくつかご紹介したいと思います。 tl;dr Ansible は、vim-ansible-yaml を入れて、CI に放り込みつつ Serverspec等で TDD / TDI すれば良い感じだと思います。 その他のAnsible tips やVagrant について書きました。 良さそうなところがあったら参考にしてみてください。 Ansible Tips 構成管理ツールは、主に Ansible が扱われています。 (AnsibleでContainer操作も可能ですが、今回Containerの話はしま
この記事を読むのに使用する時間の目安 = 15分 初めまして。 Aimingでインフラを担当している 小熊(oguma) と申します。 普段は、ウェブサイトの構築/運用管理や 東京と大阪のネットワーク設計/構築/運用管理、 backoffice toolなどのinfra/inhouse開発および 技術指導/教育やフレームワーク導入や運用設計を行なっています。 それと最近は機会が減りましたが、たまにゲームインフラ構築や 内部統制および情報システム管理や人事関連をやっています。 LLによる開発や、Infrastructure as Code、 Tuning、 Serverless、 Container、 システムの自律化関連にとても興味がある音楽と雪山が好きな酒好きです。 今日も元気に飲みにいきましょう!! さて、本題に入りますが 今回は、その中でAiming インフラチームが どのような業務
ご無沙汰しております、ソフトウェアエンジニアの滝です。 今回は、Webブラウザ版 『剣と魔法のログレス』 (以下ログレス)のデータバックアップのお話です。 1日あたり数GBという膨大なデータが出力されるため、どのようにしてバックアップを取りどのように保管しているかについてお話したいと思います。 何のバックアップを取っているか? ログレスでは、お客様のサポートや動向調査のために、行動履歴データが含まれるログデータやデータベースのバックアップを行っています。 バックアップはいつとっているのか? データベースは毎朝定期的にバックアップを出力しています。 所要時間は1時間程度ですが、1日につき数GBのダンプデータが出力されます。 ログデータは、ゲームサーバーが出力したものを取得します。 これらのバックアップファイルは、社内のログ管理サーバーにキャッシュされ、定期的に圧縮作業を行っています。 バック
次のページ
このページを最初にブックマークしてみませんか?
『Aiming 開発者ブログ』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く