おもちゃバコ

中身スカスカ♡

Unityの本を読んだメモ

こんにちワン

今回は備忘録を兼ねてUnityの個人的なメモを記事にしました.
個人的な考えが入っているので参考にされる場合は注意してください.
また,詳細は載せてないので適宜必要に応じて調べてください.  

参考書

1. Unityの教科書 Unity 2020完全対応版 2D&3Dスマートフォンゲーム入門講座
 とても分かりやすいのでUnityを少しかじったことがある方にお勧めです.


2. Unityによるモバイルゲーム開発 -作りながら学ぶ2D/3Dゲームプログラミング入門
 少し踏み込んだ内容が多いので,入門本が終わった人向けだと感じました.

スクリプト(C#)

  1. クラスメンバ変数の使用にはthisキーワードを使用
     予期しないバグを防ぐため
  2. UpdateとLate Update
     Fixed Updateもあるよ
  3. コルーチン
     中断処理が実装できる.
  4. RequireComponent
     別の方のコンポーネントが事前に存在する必要があることを知らせる.
  5. HeaderとSpace
     Inspectorを見やすくする.
  6. SerializeFieldとHideInInspector
     Inspectorに見せるか隠すか.
  7. ExecuteEditMode
     エディットモードでも実行.

ゲーム開発

  1. 設計
     1. 画面上のオブジェクトの列挙
     2. 動作オブジェクトのためのコントローラスクリプトの決定
      オブジェクトを動作させるためのスクリプト
      UIは変化するが,移動するわけではないので含めない.
     3. 自動生成のためのジェネレータスクリプトの決定
      ゲーム開始時にオブジェクトを生成させるスクリプト
     4. UI監視スクリプトの用意
      ゲーム全体を監視するスクリプト
     5. スクリプト作成の流れを検討
      2 -> 3 -> 4の順番で開発
  2. ゲーム制作の流れ
     1. プロジェクト作成
     2. オブジェクト配置
     3. スクリプト作成
     4. 実行
  3. 減衰係数
     線形変化だと不自然な時に使用する.
     なだらかに低下.
  4. 空間識失調(バーディゴ)
     平衡感覚を喪失した状態.
     3Dゲーム開発でも起こりやすいかもしれない.
  5. ポストエフェクト
     ゲーム画面全体に画像処理をかける.
     Package ManagerにあるPost Processingが良い.

UnityEditor

  1. VSync
     Gameタブ -> Aspectドロップダウン -> VSync(GameViewOnly)
  2. 3Dを2D(逆もまたしかり)
     1. Edit -> ProjectSetting -> Editor -> Behavior Mode -> 2D
     2. Window -> Rendering -> Lighting Setting -> Skyboxをnone
  3. Unity Remote
     apkにしなくてもスマホデバッグできるやつ.
     AndroidSDKの設定がめんどいかもしれない.
  4. レイヤ
     レイヤ番号は大きいほど手前に表示される.
  5. Physics
     物理演算を行ってくれるが,独自動作の実装がやや面倒になる.
     ただ,当たり判定や移動の実装は楽になるかもしれないので,作りたいアプリと要相談.
  6. Time.deltaTime
     前フレームと現フレームの差
  7. アンカーポイント
     画面サイズ変更時に,どこを起点にしてUI座標を計算しなおすか設定する.
     適切に設定することで,画面サイズに依存しないUIを作成できる.
  8. Fill Amount
     UIのimageに含まれるFill機能.
     割合で画像を見えなくする.
  9. Mecanim
     アニメーション作成から実行までを一貫して操作できる機能.

数学

  1. 円1と円2の当たり判定
     p: 円の中心座標
     r: 円の半径
\displaystyle{
d = \sqrt{({p_1}_x-{p_2}_x)^2 + ({p_1}_y - {p_2}_y)^2} \leq r_1+r_2
}

終わりに

 知識だけ身に着けるのではなく,実際に手も動かそう!

院試の参考書

こんにちは.

特にネタが思いつかないので,私が院試勉強に使用した本を紹介します.

1. 情報系

論理回路の基礎はこれで全て補えました.

論理回路入門

論理回路入門


パタヘネ本です.
個人で買うには高いので,図書館で借りてました.


改定前を使用していました.
多分,内容の変化はほとんどないと思います.
情報理論 改訂2版

情報理論 改訂2版


プログラムは,参考書とyukicoderで勉強していました.

離散数学の基礎は,この参考書と競プロで勉強しました.
IT Text 離散数学

IT Text 離散数学

2. 数学

趣味で買っていた本を使用しました.

解析演習 (基礎数学)

解析演習 (基礎数学)


統計学入門 (基礎統計学Ⅰ)

統計学入門 (基礎統計学Ⅰ)

  • 発売日: 1991/07/09
  • メディア: 単行本

詳解 大学院への数学 (改訂新版)

詳解 大学院への数学 (改訂新版)

  • 発売日: 1992/06/01
  • メディア: 単行本

3. 英語

TOEICTOEFLについて.



CEDEC2020に参加しました

こんにちは

9月2日から9月4日に開催された「CEDEC2020」に参加したときの感想です.
内容については深く触れないことをご了承ください(雑です).



9月2日(水) (1日目)

1. ポストコロナ社会とVRとゲーム
SNS禁止により,省略.

2. マルチプラットフォーム環境で実現するLLVM ClangによるSIMD自動ベクトル最適化
最適化しやすいプログラム技法について学べて良かったです.

3. ゲームプログラマのための数学の歩き方 - ラプラシアン
独学で数学を勉強する方法をラプラシアンを例に解説しています.
挫折しにくい数学の学習方法について知ることができるので,職種関係なくおススメです.

4. "FINAL FANTASY VII REMAKE"における自動QAシステムの構築と運用
FF7Rの開発で行っているのデバッグ方法についての技術提供です.
QAの知識がなくても理解しやすい内容なのでおススメです.

Python による大規模ゲーム開発環境 ~Cyllista Game Engine 開発事例~
ゲームエンジンを開発したい向けの内容です.
題材はPythonですが,ゲームエンジン開発についてのノウハウを学べます.

FINAL FANTASY VII REMAKE』におけるキャラクターアニメーション技術
FF7Rでの人体動作がRE2と似ていると思っていたら,そういうことだったのかと納得しました.

オープンワールドを、自然に意思を持って埋める。 LUMINOUS ENGINEのプロシージャルへの取り組み
会社ごとにゲームエンジンの特徴が結構違うので,面白いですね.

食品会社でのアジャイル実践:何ができる?どこまでできる?
ゲーム開発とは少し毛色が違いますが,アジャイル開発について知ることができたので良かったです.

ディープラーニングを使った自動QA、実用化へ向けて
やっぱりキーログによるゲーム再現は,アクションゲームだと難しいんだなと感じました.

ゲーム開発者のための C++11~C++20, 将来の C++ の展望
良いです.

日本人よ、このままでいいのか?!日中ゲーム開発現場から日本人クリエイターの未来像を考える~緊急時対応から見えてきた実像
大人になっても勉強は大事ですね.


9月3日(木) (2日目)

カービィの開発ツールをつなげて便利に! —ツール・ゲーム連携手法の紹介—
ゲームエンジンを開発しなくても,ゲームは開発できると感じました.
ツール開発をしている人におススメの内容です.

自己対戦と強化学習によるNPCの意思決定の研究事例
ゲームAIの開発は難しいけど,面白いなと感じる内容でした.

ゲームを使用した社会復帰について
イクラを利用した社会復帰についての講演で,ゲーム開発とはあまり関係ないですが,とても良い内容でした.
負の側面ばかりが注目されるゲームですが,この講演をきっかけにイメージが変わってほしいですね.

技術同人作家になろう ~働き方改革時代におけるエンジニアのレベルアップの一例~
実はこの講演を見て,この記事を書き始めました.


9月4日(金) (3日目)

『リングフィット アドベンチャー』~混ぜるな危険! ゲームとフィットネスを両立させるゲームデザイン
SNS禁止により,省略.

ハイブリッド型Mayaツール開発:CPP+Python連携によるスピードアップの話
Mayaはほとんど使いませんが,ツール開発の点でとても為になる内容でした.

『リングフィット アドベンチャー』のハード・ソフト一体型開発~開発サイクルの違いを乗り越える~
SNS禁止により,省略.

PERACON 2020
公式サイトの説明文が凄かったので,見てみました.
面白い企画がたくさんあり,ゲーム開発欲を刺激されました.


感想

今回が初CEDECでしたが,オンライン開催なのでスムーズに聴講することができました.

学生として参加したので現場の技術はわかりませんが,ゲーム業界全体の雰囲気や技術について知ることができたので良かったです.
ゲーム業界を志望する人は参加してみてはいかがでしょうか(受講料は高いですが...).

ゲームボーイにおけるHELLO WORLDのメモ

こんにちは

前回はRGBDSでゲームボーイの開発環境を構築して,HELLO WORLDのプログラムをエミュレータで実行しました. lambda00.hatenablog.com

今回は,HELLO WORLDのプログラムを自分なりに理解してまとめたことについての記事です.
(主に,カートリッジヘッダについてですが...)
間違えている可能性がありますので,ご了承ください.


1. HELLO WORLDプログラム

前回のプログラムにコメントと改良を加えたものです.

; ヘッダ構成
SECTION "Header", rom0[$0100] ; ROMバンク0のカートリッジヘッダ
EntryPoint:
    di       ; 割り込み無効
    jp Start ; スタート処理へ
; nintendoロゴ: $0104~$0133
db $CE, $ED, $66, $66, $CC, $0D, $00, $0B
db $03, $73, $00, $83, $00, $0C, $00, $0D
db $00, $08, $11, $1F, $88, $89, $00, $0E
db $DC, $CC, $6E, $E6, $DD, $DD, $D9, $99
db $BB, $BB, $67, $63, $6E, $0E, $EC, $CC
db $DD, $DC, $99, $9F, $BB, $B9, $33, $3E
; タイトル: $0134~$013E
; 古いカートリッジだと$0134~0143までタイトル(15バイト)
db "HELLO_WORLD" ; 適当に決めた
; メーカーコード: $013F~$0142
db "LMDA"        ; 適当に決めた
; CGBフラグ: $0143 
db $00
; 新しいライセンスコード: $0144~$0145
db "XX"          ; 適当に決めた
; SGBフラグ: $0146 (非対応: 00h,対応: 03h)
db $03
; カートリッジタイプ: $0147
db $00
; ROMサイズ: $0148
db $00
; RAMサイズ: $0149
db $00
; 発売国コード: $014A
db $00
; 古いライセンスコード: $014B
db $33
; マスクROMバージョン: $014C
db $00
; チェックサム: $014D
db $88
; グローバルチェックサム: $014E~$014F
dw $ae01

SECTION "Game Code", rom0[$150]
Start:
    ; VRAMにアクセスするため,LCDをオフにする
.waitVBlank
    ; ゲームボーイ画面サイズは「160*144」
    ; LCDC-Yは「0~143」
    ld a, [$FF44] ; $FF44は「LCDC Y座標」
    cp a, 144     ; LCDC-Y座標が144ならば,VBLANK中
    jr c, .waitVBlank

    xor a, a      ; アキュームレータをリセット
    ; $FF40は「LCD制御(LCDC)」
    ld [$FF40], a ; $FF40の7bit目を0にする(LCD表示オフ)

    ; フォント取得処理
    ld hl, $9000                    ; CHR-ROM位置?
    ld de, FontTiles                ; フォント格納番地
    ld bc, FontTilesEnd - FontTiles ; フォント数
.copyFont
    ld a, [de]       ; メモリから1バイト取得
    ld [hli], a      ; VRAMに配置して,インクリメント 
    inc de           ; 次のメモリへ
    dec bc           ; 残り文字数のカウント
    ld a, b          ; decはフラグを更新しないので,bcのZフラグチェックを行う
    or a, c          ; a = b | c
    jr nz, .copyFont ; Zフラグがセットされるまで格納処理

    ; $9800~$9BFFはBG Map Data1
    ; 「32*32=1024」,「$9800-$9BFF=$3FF=1023」より1024バイト分ある
    ld hl, $9800         ; 画面左上を指定
    ld de, HelloWorldStr ; 文字列格納番地を指定
.copyString
    ; $9800番地に文字列を転送
    ld a, [de]
    ld [hli], a
    inc de
    and a, a           ; コピーした文字列のバイトが「0」であるかチェック
    jr nz, .copyString

    ; 各種レジスタの初期化
    ; 色指定
    ld a, %11100100 ; 黒,濃グレー,薄グレー,白
    ld [$FF47], a   ; $FF47は「背景パレットデータ(BGP)」
    ; 画面位置
    xor a, a      ; アキュームレータのクリア
    ld [$FF42], a ; LCDC-Yを0
    ld [$FF43], a ; LCDC-Xを0
    ; サウンド設定
    ; $FF26は「サウンドオン・オフ切り替え」
    ld [$FF26], a   ; サウンドオフ(bit-7が0)
    ; LCDC
    ld a, %10000001 ; LCD表示有効,背景表示
    ld [$FF40], a
.lockup
    ; 無限ループ
    jr .lockup

SECTION "Font", rom0
FontTiles:
    INCBIN "font.chr"
FontTilesEnd:

SECTION "Hello World string", rom0
HelloWorldStr:
    db "HELLO, WORLD!", 0 ; 表示文字列+終端文字(今回は0)

; 残りのROMを0埋めする
SECTION "PADDING", romx
rept $7fff - $4000
    db 0
endr

2. カートリッジヘッダ情報

前回のプログラムでは,メモリマップ$0104~$0150のカートリッジヘッダ領域を0で初期化していました.
正直な所,カートリッジヘッダ情報を記述しなくてもrgbfixを利用すれば大丈夫なのですが,理解を深めるためにあえて記述しました.
基本はプログラムコメントの通りなので,気になった箇所だけ簡単に説明します.

  • $0104~$0133: Nintendoロゴ
    • この内容が間違えていると起動に失敗します.
      (海賊版への対策だと勝手に思っています?)
  • $0146: SGBフラグ
    • スーパーゲームボーイに対応しているかの判定です.
      $00: 非対応
      $03: 対応
      対応にすると枠が出現しました(楽しい).
      f:id:lambda410:20200815150709j:plain
  • $014D: ヘッダチェックサム
  • $014E~$014F: グローバルチェックサム
    • カートリッジROM全体のチェックサムです.
      ゲームボーイ実機ではチェックしないため,間違えていても起動します.
      (ただし,bgbでは警告が出ます.)

3. チェックサム

ヘッダチェックサムとグローバルチェックサムの計算は,GbdevWiki-The Cartridge Headerに詳しく書いてありました.
提示したプログラムでは既に値を記述していますが,計算前は$00で初期化してrgbasmrgblinkを行い,出力された.gbファイルからチェックサムの計算を行いました.
チェックサムの計算にはC++で作成したプログラムを使用しました.
(エンディアンに注意してください.)

#include <iostream>
#include <fstream>
#include <vector>

int main(int argc, char *argv[])
{
    if(argc < 2) { std::cerr << "ERROR " << __LINE__ << std::endl; return 1; }
    
    std::ifstream rom_file(argv[1], std::ios::in | std::ios::binary);
    if(!rom_file) { std::cerr << "ERROR " << __LINE__ << std::endl; return 1; }

    std::vector<char> rom_data;
    char data;
    while(!rom_file.eof())
    {
        rom_file.read(&data, sizeof(data));
        rom_data.emplace_back(data);
    }
    rom_file.close();
    
    std::int16_t x = 0;
    for(int i = 0x0134;i <= 0x014C; ++i)
    {
        x = x - static_cast<int>(rom_data[i]&0xff) - 1;
    }
    std::cout << "Header CheckSum: $" << std::hex << (x & 0xff) << std::endl;
    
    std::uint16_t y = 0;
    for(int i = 0x0000;i < rom_data.size();++i)
    {
        if(i == 0x014e || i == 0x014f) continue;
        y += static_cast<int>(rom_data[i]&0xff);
    }
    std::cout << "Global CheckSum: $" << std::hex << (y & 0x00ff) << ((y & 0xff00) >> 8) << std::endl;


    return 0;
}

4. パディング処理

ここまでの処理で作成した.gbファイルならエミュレータに警告されないだろうと思っていたら,ROMサイズが違うと警告されました.
ROMデータを見てみると16KBしかなく,$0148で指定した32KBになっていないことがわかりました.
そこで,バンク1以降のROMデータを0でパディングする処理を記述したところ,警告なしで起動できました.
ただ,rgblinkのコマンドでROMサイズを指定できるらしい(わかりませんでした...)のでこの処理は必要ないかもしれません.


5. アセンブラについて

ざっくりですが,andやorなどのアキュームレータを使用する処理は,アキュームレータを省いて記述することが出来ます.
以下は同じ処理です(aを0クリア).

xor a
xor a, a

詳しく知りたい方は
ISSOtm's GB programming -Interlude-
で解説されていますので,ご確認ください.


6. まとめ

すっっごく簡単に前回のプログラムの解説メモを書きました.

次は,開発しやすいようにメモリマップやレジスタ関係のメモを1ページにまとめてみたいと思います.

ゲームボーイ開発環境の構築

ゲームボーイの開発環境を構築したので,それについてのメモです.

ゲームボーイの開発環境として有名なものは,
  1. GameBoy Developers Kit (GBDK) : C言語
  2. Rednex Game Boy Development System (RGBDS) : アセンブリ
の2つが挙げられますが,今回はRGBDSを使用しました.


1. 開発環境

  • OS: Windows10 (May 2020 Update済み)
  • CPU: Intel Core i7-3517U 1.90Ghz
  • RAM: 8.00GB

2. ソフトウェア


3. ソースコード

動作確認プログラムとして,ISSOtm’s code warehouseで公開されている「Hello World!」のプログラムを改良したものを使用しました.
ISSOtm’s code warehouseさんの方では,「hardware.incfont.chrをダウンロードして同じディレクトリに入れてね」と書いてありますが,ハードウェアへの理解を深めるためメモリは直書きし,font.chrの方だけ使用しました.

hello_world.asm

SECTION "Header", rom0[$100]

EntryPoint:
    di
    jp Start

rept $150 - $104
    db 0
endr

SECTION "Game Code", rom0

Start:
    
.waitVBlank
    ld a, [$ff44]
    cp 144
    jr c, .waitVBlank

    xor a
    ld [$ff40], a

    ld hl, $9000
    ld de, FontTiles
    ld bc, FontTilesEnd - FontTiles
.copyFont
    ld a, [de]
    ld [hli], a
    inc de
    dec bc
    ld a, b
    or c
    jr nz, .copyFont

    ld hl, $9800
    ld de, HelloWorldStr
.copyString
    ld a, [de]
    ld [hli], a
    inc de
    and a
    jr nz, .copyString

    ld a, %11100100
    ld [$ff47], a

    xor a
    ld [$ff42], a
    ld [$ff43], a

    ld [$ff26], a
    ld a, %10000001
    ld [$ff40], a
.lockup
    jr .lockup

SECTION "Font", rom0

FontTiles:
    INCBIN "font.chr"
FontTilesEnd:

SECTION "Hello World string", rom0

HelloWorldStr:
    db "HELLO, WORLD!", 0

4. ROM生成

アセンブラとリンクだけでROMファイルの生成は出来ますが,そのままBGBで起動するとチェックサムがおかしいと警告が出ます.
f:id:lambda410:20200811172949j:plain

なので,リンク後はrgbfixを使用してROMの修正を行います.
1. rgbasm -o hello_world.o hello_world.asm
2. rgblink -o hello_world.gb hello_world.o
3. rgbfix -v -p 0 hello_world.gb

実行すると「プッツ」という音が一瞬鳴って「HELLO, WORLD!」と表示されます.
f:id:lambda410:20200811173131j:plain


5. まとめ

ゲームボーイの開発環境構築を行いました.
子供の頃に遊んでいたゲームを個人で開発できることは,とても感慨深いですね.

これからは,少しずつゲームボーイへの理解を深めながらゲームの開発と実機での実行環境を整えたいと思います.