型変換及び算術演算やMathfの結果早見表

ビット演算


      print (string.Format ("{0:x8}", 0x87654321 & 0xffff0000));    //AND
       //87650000
       print (string.Format ("{0:x8}", 0x87654321 | 0xffff0000));    //OR
       //ffff4321
       print (string.Format ("{0:x8}", 0xffff0000 ^ 0xff00ff00));    //XOR
       //00ffff00
       print (string.Format ("{0:x8}", ~0xffff0000));            //NOT
       //0000ffff


  1と1 1と0 0と1 0と0  
AND 1 0 0 0 ×算(0の方が強い)
OR 1 1 1 0 +算(1の方が強い)
XOR 0 1 1 0 0と1の組み合わせならtrue
NOT         真逆になる

<サンプル1>

using UnityEngine;
using System.Collections;
using System; //Convertクラスを利用するのに必要

public class FlagTest1 : MonoBehaviour
{
  int flagNONE = 0;
   int flagIDLE = 1;
   int flagATTACK = 2;
   int flagPAUSE = 4;
   int flag = 0;
   
   void Start ()
   {
       flag = flagNONE;
       
       flag = Convert.ToInt32 ("00000010", 2);    //2進数の文字列を整数に変換
       flag |= flagIDLE;                        //ビット演算で立てる
       flag |= flagPAUSE;
       flag &= ~flagPAUSE;                        //ビット演算で消す
       
       print (Convert.ToString (flag, 2).PadLeft (8, '0'));        //整数を8桁の2進数表示
       print ((flag & flagATTACK) != 0);        //ビットの判定方法その1
       print ((flag & flagATTACK) == 0);        //ビットの判定方法その2
   }
}

//00000011
//True
//False

<補足>
状態遷移を管理する場合、2種類の方法がある。
  • enumで作成した変数を利用する(ステータスが重複しない。状態遷移は常に一つの状態で固定できる)
  • intの変数でビットを管理して行う(各ビットのオンオフにより複数のステータスを同時管理できる。ビット演算のやり方で一つの状態で固定も可能)

後者の方法ではビットシフトやビット演算の使い方により広範囲な機能を持たせる事が可能だがコードが難解になりやすい
どちらを選ぶかは、要求する機能によって選ぶと良い


Random


floatとintで挙動が変わることに注意。
パラメーターのminとmaxは
intの場合、min(含む)max(含まれない)
floatの場合、min(含む)max(含む)となる

Returns a random integer number between min [inclusive] and max [exclusive] (Read Only).
Returns a random float number between and min [inclusive] and max [inclusive] (Read Only).


例。
      for (int i = 0; i < 10; i++) {
           int r=Random.Range(0,3);
           print(r);
       }
//2,1,2,0,2,0,1,2,1,0

      for (int i = 0; i < 10; i++) {
           float r = Random.Range(0.0f,3.0f);
           print(string.Format("{0:f8}",r));
       }
//2.99963200 , 2.48254600 , 1.04920700 , 0.22979920 , 0.79245920 , 0.00000000(ありえる) , 3.00000000(ありえる)~

floatのランダムに対して「(int)」で型変換をした状態が「intのランダム」と考えると自然
つまり内部で小数点切捨ての型変換処理がされているような動作。floatのmaxが本当のmaxの値で出てくることは稀だがありえなくはない。

Random.value 0~1の間のランダムなfloatの値になる 例:0.7869810


ビットシフト


      print(1<<0);
//1
       print(1<<1);
//2
       print(1<<2);
//4
       print(1<<3);
//8
       print(1<<4);
//16

float → int


print ( (int) 2.001f );
// 2
print ( (int) 1.999f );
// 1
print ( (int) 1.134f );
// 1
print ( (int) 0.999f );
// 0
print ( (int) 0.001f );
// 0
print ( (int) 0.000f );
// 0
print ( (int) -0.001f );
// 0
print ( (int) -0.999f );
// 0
print ( (int) -1.111f );
// -1
print ( (int) -1.999f );
// -1
print ( (int) -2.199f );
// -2

基本、少数点以下切捨て
-0.999 ~ 0 ~ 0.999 はすべて0になる点に注意

Mathf.Ceil

小数点以下、切り上げ

      print(Mathf.Ceil(1.999f));
       //2
       print(Mathf.Ceil(1.111f));
       //2
       print(Mathf.Ceil(1.000f));
       //1
       print(Mathf.Ceil(0.999f));
       //1
       print(Mathf.Ceil(0.001f));
       //1
       print(Mathf.Ceil(-0.001f));
       //0
       print(Mathf.Ceil(-0.999f));
       //0
       print(Mathf.Ceil(-1.111f));
       //-1
       print(Mathf.Ceil(-1.999f));
       //-1

Mathf.Round

小数点以下、四捨五入

      print(Mathf.Round(11.01f));
       //11
       print(Mathf.Round(15.99f));
       //16
       print(Mathf.Round(19.33f));
       //19
       print(Mathf.Round(19.4999f));
       //19
       print(Mathf.Round(19.5f));
       //20
       print(Mathf.Round(19.51f));
       //20

Vector3.Dot(内積)


  • ある特定方向に対して真逆に向いているかどうか等を検出する用途に使える
積と付くだけあって「積(×算)」である


      print(Vector3.Dot(new Vector3(1,0,0),new Vector3(0,0,0)));
       //0
       print(Vector3.Dot(new Vector3(1,0,0),new Vector3(1,0,0)));
       //1
       print(Vector3.Dot(new Vector3(1,0,0),new Vector3(-1,0,0)));
       //-1
       print(Vector3.Dot(new Vector3(1,0,0),new Vector3(-0.5f,0,0)));
       //-0.5
       print(Vector3.Dot(new Vector3(1,0,0),new Vector3(0.5f,0,0)));
       //0.5
       print(Vector3.Dot(new Vector3(1,0,0),new Vector3(0,0,1)));
       //0
       print(Vector3.Dot(new Vector3(1,0,0),new Vector3(0,0,-1)));
       //0
       print(Vector3.Dot(new Vector3(1,0,0),new Vector3(0,0,-0.5f)));
       //0


      Vector3 a;
       Vector3 b;
       
       a = new  Vector3(1,0,0); 
       b = new  Vector3(-1,0,0); 
       print(Vector3.Dot(b,a));
       //-1
       
       b = new  Vector3(0,0,-1); 
       print(Vector3.Dot(b,a));
       //0
       
       b = new  Vector3(-1,0,-1); 
       print(Vector3.Dot(b,a));
       //-1

      b = new  Vector3(-0.5f,0,-0.3f); 
       print(Vector3.Dot(b,a));
       //-0.5

      b = new  Vector3(0.3f,0,-0.5f); 
       print(Vector3.Dot(b,a));
       //0.3

      b = new  Vector3(-0.3f,1,-0.5f); 
       print(Vector3.Dot(b,a));
       //-0.3

      b = new  Vector3(-0.3f,0.5f,-0.5f); 
       print(Vector3.Dot(b,a));
       //-0.3
       
       b = new  Vector3(-0.3f,0.1f,-0.1f); 
       print(Vector3.Dot(b,a));
       //-0.3

      a = new  Vector3(0.5f,0,0); 
       b = new  Vector3(-0.5f,0,0); 
       print(Vector3.Dot(b,a));
       //-0.25
       
       a = new  Vector3(-1,0,0.5f); 
       b = new  Vector3(-0.5f,0,0); 
       print(Vector3.Dot(b,a));
       //0.5
       
       a = new  Vector3(1,0,1); 
       b = new  Vector3(-1,0,-1); 
       print(Vector3.Dot(b,a));
       //-2
       
       a = new  Vector3(0.5f,0,0.5f); 
       b = new  Vector3(-0.5f,0,-0.5f); 
       print(Vector3.Dot(b,a));
       //-0.5

割り算及び余り


      int xi = 3;
       int yi = 4;
       print( xi / yi );
       print( xi % yi );
       print( yi / xi );
       print( yi % xi );
       //0
       //3
       //1
       //1
       //小数点無し、切捨てになる
       
       float xf = 3;
       float yf = 4;
       print( xf / yf );
       print( xf % yf );
       print( yf / xf );
       print( yf % xf );
       //0.75
       //3
       //1.333333 (floatは小数点6桁まで有効)
       //1
       //小数点有り

資料リンク



メニュー



  • 最終更新:2014-06-13 10:29:24

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

認証パスワード