個人的なメモ帳



方程式を考える時に注意する事


  • 文章から方程式を作る訓練をする事
数式を憶えるよりも、これが一番大事。最初はコピペで良い。最後は必ず文章から方程式にしてみるようにする

  • 方程式は未知数の値を求める操作
従って最初に未知数として設定する場所を間違うとその解を導く行為自体が意味の外れたものになる
未知数を何処に設定するか?この最初の一歩を間違えない事!

メモ


4つのp

  • Projects 物を触って作る
  • Peers 仲間と一緒にやる
  • Passion 情熱が沸く事をやる
  • Play 遊びが必要


アイディア


理想
  • 将来、人と一緒に遊んでくれるようなテレビゲーム、もしくはAIかロボットを作る
  • イノベーションではなくユニークと言われたい(イノベーションは古典を否定している時がある)
  • STGは美しいと思う。長く時代を超えて規範とすべきもの「古典」としてどこかで作る


TED



C#の注意点


基礎的な再確認メモ
もう一度良く確認しておく事

Q.
ヘッダーのusing宣言で自作や他作のライブラリを取り込む場合
名前空間の異なるコードで同一名のクラスや構造体を作っていないか注意!
(ワーニングやエラーが出ないか一度要検証)

A.
名前空間が異なれば基本的に警告やエラーの類は一切出ない
usingで複数の名前空間から取り込んで名前が重複していた場合、どの同名構造体やクラス、関数が使われるか判らなくなる

using等で複数の自作ライブラリを取り込んだ際、この同名の衝突が知らない間に発生している危険がある
自作ライブラリを寄せ集めて取り込む際はこの事を常に注意しておく事(基本的にヘッダ部分のusing宣言にはこのようなリスクがある)

なので「同性質な自作ライブラリ」を複数同時利用する際はusing宣言で利用せず、
各個、名前空間を指定してライブラリを利用する方がトラブルは少ないかもしれない

もしくは名前空間を使わずヘルパー関数やクラス、構造体を作成する方針にするか・・・(この場合はコンパイラーが重複を発見すると警告してくれる)
それはそれで、将来、複数人で作業したりプログラムが大きくなれば作業しにくくなる??


structについて


Q.
コンストラクターの初期化関数を書いたら基本的に、classのようにnewしなければならなくなるらしい

A.
そんなことなかった。別の原因エラーが出ていた(理由後述)


<問題が出ないコードのサンプル>
using UnityEngine;
using System.Collections;

struct TestStruct{
  public float x,y;
}

struct Test2Struct{
  public float x,y;

  public Test2Struct(float x,float y){
       this.x= x;
       this.y= y;
   }
}


using UnityEngine;
using System.Collections;

public class CSharpTest1 : MonoBehaviour {

  void Start () {
   

      TestStruct tes;
       tes.x=12;

      print (tes.x);

      Test2Struct tes2;

      tes2.x=12;
       print (tes2.x);
       tes2 = new Test2Struct(24,48);
       print (tes2.x);
       

  }
   
   void Update () {
   
   }
}



<勘違いを誘発したエラーが出る場合の再現コード>

片方のC#ファイルに名前空間「TestSapce」を作成して中に「TestStruct」構造体を作る
そして、もうひとつC#ファイルをつくり、こちらは通常のMonoBehaviourを継承したクラスと
その語尾にTestStruct構造体を作るコードを付け加えると、コンパイラは同一の構造体が
あるにもかかわらず、名前空間は違うので、このコードをコンパイラに通してしまう

これによりクラス内の12行目、st2.x= new TestStruct(12,24)で期待した構造体側の関数を認識できなくなりエラーを出してしまう。

<ファイルA>

using UnityEngine;
using System.Collections;
using TestSapce;

public class NewBehaviourScript1 : MonoBehaviour {

  void Start () {
       TestStruct st;
       st.x=12;

      TestStruct st2;
       st2.x= new TestStruct(12,24);    //ここでエラーが出る

      print(st2.x);
   }
   
   void Update () {
   
   }
}

struct TestStruct{
  public float x,y;

}


<ファイルB>
using UnityEngine;
using System.Collections;

namespace TestSapce{

  struct TestStruct{
       public float x,y;
       
       public TestStruct(float x,float y){
           this.x =x;
           this.y =y;
       }
   }

}

重複した構造体名を作成していてもコンパイルが通ってしまう原因は、その宣言された各構造体が属する名前空間が異なる事によって発生している
using等で自作のライブラリを取り込んだ場合、この点に注意しておかないとハマる場合がありそう…


classについて


Q.
staticな関数を埋め込む場合、必ずしもclassにpublic修飾はいらないっぽい(classに対してのpublic修飾自体あまり意味がない???)
privateのクラスって???
class内のstatic関数でも、外部から利用するならpublicは必要

A.
クラスなどの型は、名前空間直下やグローバル スコープ中で定義できますが、 この場合、public もしくは internal のみが指定可能です。
この場合、アクセス修飾子を省略すると internal 扱いになります。 (クラスにprivateは存在しない)
クラス内では全てのアクセス修飾子が利用可能です。 この場合、省略すると private 扱いになります。



staticについて


static関数内でクラスや構造体のインスタンス内部の変数を利用するようなコードはアウト
理屈で考えるとstaticにすることで関数のパラメーター(引数)以外は関数の内部の要素はメモリに定着している

<NG例1>
static関数内でクラスや構造体のインスタンス内部の変数を利用するようなコードはアウト
理屈で考えるとstaticにすることで関数のパラメーター(引数)以外は関数の内部の要素はメモリに定着している
この場合、staticなのでthis.x等は見つけられない

using UnityEngine;
using System.Collections;

public class NewBehaviourScript : MonoBehaviour {

  public float x,y;

  void Start () {
       print( AddMethod() );
   }

  public static float AddMethod(){
       float z = this.x + this.y;
       return z;
   }
}

<これならコンパイルは通る>

public class NewBehaviourScript : MonoBehaviour {

  public float x,y;

  void Start () {
       print( AddMethod() );
   }

  public static float AddMethod(){
       float z = 1+2;
       return z;
   }
}

Q.
パラメーターとしての変数を扱う事は可能
関数内部で作られた変数は利用可?

A.
可能

public class NewBehaviourScript : MonoBehaviour {

  public float x,y;

  void Start () {
       print( AddMethod(1,2) );
   }

  public static float AddMethod(float a,float b){
       float z=24;
       z *= a+b;
       return z;
   }
}

クラス内のインスタンス内の変化する値をstaticな関数内に取り入れたければ関数の引数(パラメーター)として取り込むことを検討する
この場合aとbに引数としてxとyを渡すとNG例で望んでいた動作は得られる


意味


フーリエの冒険のメモ


特に難易度の高い章のメモ

<sinθの微分>
各ページの内容が何をやっているかを把握するためのメモ

P200 f(θ)=sin(θ)として微分する際、sin(θ+Δθ)するが、この部分は単純計算ではうまくいかない事が説明されている
P201 sin(θ+Δθ)はsinθ+sinΔθとは違う。sin(θ+Δθ)を計算する為に方法を探す事になる
P202 sin(a+b)→これはsin(θ+Δθ)の代価バージョン。a=θ。b=Δθ。角度a、角度bのふたつの三角形を単位円内に納め
P203 幾何学的に三角形の相似を利用して式を導き出す(cos(a)sin(b)+sin(a)cos(b)等)
P204 直前に得られた式を利用して微分するが0の除算が現れるので計算を中止して、加法定理の他の計算を調べる
P205 cos(a+b)の加法定理式を作成
P206 sin(-θ)=-sinθ cos(-θ)=cos(θ)を説明。続けて他のふたつの加法定理を作り出す
P207 式の変形
P208 式の変形
P209 式の変形。ここまで得られた定理でもう一度微分を最初からやり直している
P210 ラジアンの説明
P211 ラジアンの説明
P212 lim(Δθ→0) sinθ/θ=1の説明。つまるところ極限を利用すると傾きは0ではなく1になる
P213 Sinθの微分再開。dsinθ/dθ=cosθを確認
P214 これまで得られた三角公式を利用してフーリエ級数式の一要素sin(nωt)の微分を開始
P215 nωcos(nωt)を作る
P216 グラフを描いて成立を確認。dsin(nωt)/dt=nωcos(nωt)


SimpleSpriteGUI.csの解析


「oni」のサンプルスクリプト内に収録されていたファイルSimpleSpriteGUI.csの解析を行う

マトリックスによる画像の移動回転縮小表示の仕組みを理解する
GUIはマトリックスをセットして表示する事により、その行列をアフィン変換として扱い表示できるらしい?
リファレンスではそういった使い方は提示されていないが可能なようだ


<いくつか気になる点がある>
現バージョンのunityでは2D機能が追加されているので、この機能を勉強する意味が無い可能性がある

→ ここは軽く「出来る事を把握する程度にして」一度新しく追加された機能を確認した方が良い?


DungeonEaterのコードを解析


<意図>
ソースリストの動作を理解しゲームそのものをどう制御しているかを理解する
各コードの仕様や挙動を箇条書きにしていく事によりゲーム全体を俯瞰して眺める



GameCtrlのメモ


ゲームの司令塔(最初に思っていたより受動的。周りから指示や情報を受けて偏移の為、指示を与える司令塔みたいな感じ)
敵のリスポーン指示
プレーヤーキャラクタへの指示
スコアへの指示(スコアオブジェクトは起動のみ、あとはそのオブジェクトに動作をゆだねてる)
ゲーム状態の遷移によりステージ開始やクリア等の指示を出している(外部から指示が飛んできている)

最低限のゲームに必要な初期化指示をしてあとは外部のオブジェクトから受動的に情報や関数起動の指示を受け取り
ゲーム状態を遷移させるような動作をする

GridMoveの仕様


自機とモンスターのグリッド移動に共通利用されるコンポーネント

<考察>
割算や型変換、四捨五入の利用法が興味深い
「割る」という行為は物を分割して基準(グリッド)を得る事が出来るらしい
そのグリッドの交差点をプレーヤーが超える時を検出したり、if等を利用せず算術(Mathf.RoundToInt等)を利用して状態遷移(自動的な位置移動)を行える
(「DungeonEater」のグリッドの交差点通過を検出。「おに」の背景がループする等)



PetitPazzleのメモ

  • renderキューがうまく反映されない?

DungeonEaterのメモ


要件定義

<GetMoveDirection>

  • 入力は即座に反映される
  • 縦横軸0.1以下の入力はあそびとして無視される
  • 常に0.2秒間入力は延長される
  • 4方向デジタルレバーを擬似的に再現し上下左右どれか一つの入力に絞る
  • 最期にvector3を返す。デジタルレバーの為、値は0か1にする

覚書

ベクトル同士の減算で目標を得られる
内積は敵が自機に向けて弾を撃つなどの処理に向く
外積は面の法線を得る際に便利(3頂点と2本のベクトルから法線は必ず求められる)

<オブジェクトを動かす際は注意>
transform.Positionは絶対座標
transform.Translateは相対座標

Update()やOnGUI()は必ず毎フレーム通るのでその部分を状態遷移をメインにコードを書くことで
視覚効果など非常によい効果が得られる

Textureは既存のテクスチャ画像を扱う時に便利で
内部で新規にテクスチャ領域を確保して描画する際はTexture2Dを利用する?

作業用抽斗




  • 最終更新:2015-01-23 03:14:23

このWIKIを編集するにはパスワード入力が必要です

認証パスワード