UNITYでFloat型の接尾辞fについて

このQ&Aのポイント
  • UNITYでFloat型の値を表現する際に使用される接尾辞「f」について詳しく説明します。
  • また、Vector3構造体やTransformでの位置指定において「f」の有無が位置を変化させることについても解説します。
  • 更に、理解を深めるための参考サイトも紹介します。
回答を見る
  • ベストアンサー

UNITY Float型の接尾辞fって

UNITYに限ったものではないのですが、Float型の接尾辞fについて Wikiやhttp://www.wisdomsoft.jp/40.html/を見てみたのですが ちょっと難しく理解できません。fってどのような時に使うのでしょうか? Vector3 構造体のコンストラクタの部分で public Vector3(float x, float y, float z)   ←となっていますが、 Vector3 v = new Vector3(765, 961, 876); ←fはついていないですし。 またUNITYのTransformで PositionをX=0.5、Y=0.5、Z=0.5とするのと、X=0.5f、Y=0.5f、Z=0.5fとするのと位置が全然違います。 分かりやすい説明、サイトなどあれば教えてください

質問者が選んだベストアンサー

  • ベストアンサー
noname#247307
noname#247307
回答No.2

これは多分、C#の解説を見たんでしょうね。Unityでは、JavaScript(UnityScript)の他、C#などの言語が使えます。Unityのコードの解説を読むときは、それが何の言語で書かれたものかを理解して読む必要があります。 0.5fとかの「f」は、C#で「float型リテラル」を示すものです。リテラルというのはソース・コード内に直接記述される値のことです。C#では、fを付けずに普通に0.5というように書くとdouble型(floatより値の精度が高い値と判断されます。Unityでは、実数を扱うメソッドなどではすべてfloat型が使われているため、そのまま0.5というように書くと叱られるのです。それで、0.5fというように書いて、float型の値にします。 また、Vector3 v = new Vector3(765, 961, 876);というサンプルコードは、これは引数すべてが整数(int値)になっています。C#では、floatなどの実数の引数に整数を指定すると暗示的キャストといって自動的にfloatに変換してくれるんです。だから、わざわざnew Vector3(765f, 961f, 876f);なんて書かなくていいんです。(doubleからfloatへは自動で変換してくれません。だから、0.5はいちいち0.5fと書かないといけません) ただし、これは「C#という言語を使ってプログラムを書くとき」の話です。UnityのソフトでインスペクターのTransformに値を設定するときは、(Unityのソフトの部分はプログラミング言語とは関係ないので)0.5と書きます。0.5fって数字はありませんから、そんな具合に書くと正しく判断されないでしょう(おそらく、ゼロ扱いになるのでは)。 またUnityのプログラムでも、JavaScriptではソースコードはすべて0.5と書かれます。0.5fとは書きません(書いても動きますが意味ありません)。言語が違えば、書き方も変わってくるのです。 Unityの解説サイトなどでは、C#とJavaScriptが混在しています。そして大抵の場合、C#などの言語は既に理解しているものとして詳しい説明は省いてます。ですので、まずはC#について初歩から学んでおくとよいと思います。

ekekojr
質問者

お礼

回答ありがとうございます! 丁寧に解説頂き、とても良くわかりました。 C#の初歩について、並行して学んでいきたいと思います。 ありがとうございました。

その他の回答 (1)

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

これは Unity の仕様というよりは C 言語およびその表記を流用している言語の大半で採用している言語仕様の話です。 たとえば 0.5 という値をそのまま書いた場合。これは実数値の 0.5 として扱われます。しかし、上記の大半の言語では実数値を表す型は float と double の 2 種類があり、0.5 が float と double のどちらの型かを仕様で決めなくてはなりません。そして、上記の大半の言語ではこれを double 型の 0.5 と規定しています。 では float 型の 0.5 がほしい場合はどうしたらいいか。そのときのために f を後置した 0.5f という表記を float 型の 0.5 として扱うと言語仕様で規定しています。 http://msdn.microsoft.com/ja-jp/library/aa691085(v=vs.71).aspx では > Vector3 v = new Vector3(765, 961, 876); になぜ f を付けていないかですが、この場合はこう書かれた時点では数値に . が使われていないため整数型の値としてまず扱われます。しかし、整数型の値を float 型の引数の値として扱う時点で暗黙の型変換が行われます。 http://msdn.microsoft.com/ja-jp/library/ms173105.aspx http://msdn.microsoft.com/ja-jp/library/y5b434w4.aspx つまり、この場合は f をつけなくてもその値が float に自動的に変換されることになっているため、つけてもつけなくてもそれぞれの値は float 型の値として処理されます。

ekekojr
質問者

お礼

回答ありがとうございます! 参考リンクも教えて頂き、感謝致します。 まずは、c#の初歩について学んでいきたいと思います。

関連するQ&A

  • Unityの質問です。

    ボタンを押すと、キャラクターの真後ろにオブジェクトが出現するようにしたいのですが、 using UnityEngine; using System.Collections; [ExecuteInEditMode()] public class GUIController : MonoBehaviour { public CharacterController characterController; public GameObject character; public GameObject domino; private Vector3 objPosition; // Use this for initialization void Start () { objPosition = new Vector3 (0, 0, 0); } void OnGUI(){ if(GUI.Button(new Rect(600, Screen.height - 160, 120, 120), "おす")){ Debug.Log("ぼたん"); float x = characterController.transform.localPosition.x; float y = characterController.transform.localPosition.y + 0.5f; float z = characterController.transform.localPosition.z - 0.64f; objPosition.Set(x, y, z); Debug.Log (x+","+y+","+z); GameObject domino_prefab = (GameObject)Instantiate(domino,objPosition, characterController.transform.rotation); } } } こうしてみたのですが、うまくキャラクターの真後ろにオブジェクトが出てきてくれません。 どなたか助けてください!

  • UnityC#の質問です!

    プログラミング初心者です。 ブロックを5*9で並べるスクリプトなのですが。 using UnityEngine; using System.Collections; public class SceneControl : MonoBehaviour { public static int BLOCK_NUM_X = 9; public static int BLOCK_NUM_Y = 5; public GameObject BlockPrefab = null; public BlockControl[,] blocks; void Start() { // ブロックを生成、配置する. this.blocks = new BlockControl[BLOCK_NUM_X, BLOCK_NUM_Y]; int color_index = 0; for(int y = 0;y < BLOCK_NUM_Y;y++) { for(int x = 0;x < BLOCK_NUM_X;x++) { //BlockPrefabをGameobjectにキャストする GameObject game_object = Instantiate(this.BlockPrefab) as GameObject; BlockControl block = game_object.GetComponent<BlockControl>(); this.blocks[x, y] = block; // Vector3 position = block.transform.position; position.x = -(BLOCK_NUM_X/2.0f - 0.5f) + x; position.y = -0.5f - y; block.transform.position = position; block.SetColor((BlockControl.COLOR)color_index); // color_index = Random.Range(0, (int)BlockControl.COLOR.NORMAL_COLOR_NUM); } } // } } で、 Vector3 position = block.transform.position; position.x = -(BLOCK_NUM_X/2.0f - 0.5f) + x; position.y = -0.5f - y; block.transform.position = position; の部分についてなのですが、Vector3 position = block.transform.position;で参照を渡しているので、block.transform.position = position;が必要ないと思い、コメントアウトした所、同じ位置にブロックが生成されてしまいました。 参照を渡していいるため position.x = -(BLOCK_NUM_X/2.0f - 0.5f) + x; position.y = -0.5f - y; の部分で、block.transform.positionの中身が書き換わっていると思ったのですが違うのですか??

  • unityでのプログラミングについて

    いまunityでゲームを制作していてシューティングのゲームをつくっています。 そこで次のようなプログラムを作成したのですがエラーが返ってきて困っています。 var bulletPrefab : GameObject; var bulletInterval : float = 0.2; var bulletEnable : boolean = true; var bulletVelocity : float = 100; var bulletTime : float = 0.0; (省略してます) function start(){ (省略してます) function update(){ if(Input.GetButton("Jump") && bulletEnable) { ←エラー箇所です。 bulletEnable = false; var bullet = Instantiate(bulletPrefab,transform.position,transform.rotation); var direction : Vector3 = Vector3(0,0,1); bullet.rigidbody.AddForce(direction * bulletVelocity,ForceMode.VelocityChange); } bulletTime += Time.deltaTime; if (bulletTime &gt;bulletInterval) { ←エラー箇所です。 bulletTime = 0.0; bulletEnable = true; } } 次のエラーが返ってきます。 Assets/character.js(22,19): BCE0044: expecting ), found ';'. Assets/character.js(22,20): BCE0043: Unexpected token: bulletInterval. こんな感じでエラーがでます。 解決方法を知ってる方は教えてください。おねがいします。

  • ∇(ナブラ)fが分かりません

    r(ベクトル)=(x,y,z) r=√(x2+y2+z2) の時に、∇fをdf/dr,r(ベクトル),rで表せとあるのですが、どのような答えが出てくるのか分かりません。 ∇rや∇・r(ベクトル)を出せばよいのでしょうか? 教えてください。

  • Unity初心者ですコンパイルエラーで詰まってます

    HPを参考にシューティングゲームの勉強をしています。 そこでUnityのGameシーンで自機を動かしたり背景を付けたりは上手く行ったんですけど、次の背景を動かすというところで詰まりました。Background c#スクリプトを作成して  using System.Collections; using System.Collections.Generic; using UnityEngine; // 背景を制御するコンポーネント public class Background : MonoBehaviour { public Transform m_player; // プレイヤー public Vector2 m_limit; // 背景の移動範囲 // 毎フレーム呼び出される関数 private void Update() { // プレイヤーの現在地を取得する var pos = m_player.localPosition; // 画面端の位置を取得する var limit = Utils.m_moveLimit; // プレイヤーが画面のどの位置に存在するのかを、 // 0 から 1 の値に置き換える var tx = 1 - Mathf.InverseLerp( -limit.x, limit.x, pos.x ); var ty = 1 - Mathf.InverseLerp( -limit.y, limit.y, pos.y ); // プレイヤーの現在地から背景の表示位置を算出する var x = Mathf.Lerp( -m_limit.x, m_limit.x, tx ); var y = Mathf.Lerp( -m_limit.y, m_limit.y, ty ); // 背景の表示位置を更新する transform.localPosition = new Vector3( x, y, 0 ); } } を自分で打った時にコンパイルエラーが出たのでそのままコピーして 再度再生してみたらやっぱりcs 0117 で翻訳したら 画面端の位置を取得する所のm_moveLimitが定義されていませんという内容でした。 見本をそのままコピーしたので間違いが解りません。 ネットで調べたらpublic class Background をMy Backgroundに変えて解決出来ますとあったので試しましたが駄目でした。 本当は一からC#を勉強していけば解る問題かもしれないですけど まずは人の真似から段々と覚えていきたいのでこういう勉強方法を取っています。 Unityのバージョン内容もよく変わって使えない言葉が出てエラーに なったりもあるみたいなのでバージョンの関係もあるんでしょうか??。私が使っているのは2020.1.2f1です。 どうかUnityに詳しい方のお力をお貸し下さい。 よろしくお願いいたします。

  • F=gradV、Fが与えられているときVはどう求める。

    タイトルのとおりなのですが F = gradV (Fはベクトル関数、Vはスカラー関数) Fが与えられているとき、Vを求めるにはどのような計算をすればよいのでしょうか。 (参考書に載っている問題なのですが解説はおろか解答もないのです・・・) (1)F=(1,1,1) (2)F=(x,y,z) (3)F=(y+z,z+x,x+y) (1)(2)などはメノコで見つかりはするのですが、確実に求められる方法が 知りたいです。どうかご教授ください。 よろしくお願いいたします。

  • unityで今プログラムを組んでいます

    今prefabで生成した物(クローン)のY座標を配列に入れて その中で現在一番数値の多いものを表示というものを作りたいのですが以下のプログラムだと 現在の高さではなくクリックで生成した物の高さになってしまいます。 理由が分からないのでアドバイスお願いします。 var test : Transform; var foo2 = new Array(); function Update(){     //クリック if (Input.GetButtonDown ("Fire1")) { Instantiate(test, transform.position, transform.rotation);//生成 } } //判定 function OnCollisionEnter(info : Collision) { foo2[i] = this.transform.position.y;//配列代入 //配列の中身調べる for(var A = 0; A <= i; A++){ if(foo2[i] > SavePos_y){ SavePos_y = foo2[i]; Debug.Log(foo2[i]); i++; } }

  • 演算子オーバーロード?

    下記記載の Vector& operator+=(Vector u) メソッドの意味が理解できません。 inline Vector& Vector::operator+=(Vector u)とはどういう意味なのでしょうか? 質問がへたくそで申し訳ないのですが、どのたかご回答お願いします。 class Vector{ public: float x; float y; float z; }; inline Vector& Vector::operator+=(Vector u) { x += u.x; y += u.y; z += u.z; return *this; }

  • 【Unity】オブジェクトが跳ね返らない

    Unityの勉強どころか、プログラムの勉強を始めたばかりの者ですが、 質問にご回答いただけないでしょうか。 javaで壁に当たるたびに跳ね返るというオブジェクトを作りたいのですが、 下記のようなスクリプトでやってみた所、壁に衝突した際に跳ね返るときと、跳ね返らない時があります。 なぜ跳ね返らない時があるのかよくわからないのですが、いったい何故なのでしょうか? ---------------------------------------- #pragma strict var way = -1; var count = 0; function Update () { transform.position += Vector3.right * 5 * way * Time.deltaTime; } function OnCollisionEnter(collision: Collision) { count = count +1; Debug.Log(count); way = way * -1; } ------------------------------------------ 宜しくお願い致します。

  • 深度画像をクラスとして定義する方法について教えて

    VS C++2010を用いて、kinect for Xboxから読み取った深度画像(IplImage *SdepthImg)の データをクラスにする方法を教えていただけないでしょうか。 以下のソース[1]として定義しております。また、深度画像をこのクラスに入れて、以下のソース[2]を用いて深度画像の3次元座標情報を入手するつもりです。 クラスの定義は [1] class Object { private: int regionNumber; bool isTarget; bool isNotTarget; int probTarget; char objectName[128]; char objectClassName[128]; //オブジェクトだけの画像 IplImage *ObjImg; IplImage *ObjDepthImg; IplImage *ObjMaskImg; IplImage *ObjDepthMaskImg; //シーンの中での画像 IplImage *maskImg; IplImage *depthmaskImg; //オブジェクトの3次元点群 float *X_points; float *Y_points; float *Z_points; Vector3D center3D; Vector3D center3D_R_CORD; Vector3D volume3D; std::vector<int> color; std::vector<int> material; std::vector<float> material_likely; //std::map<int,float> material; std::map<int,float> shape_primitive; float roundness; int position[4]; //↑ ↓ → ← の順に 最寄りの物体の領域 番号 ないかも知れない void makeMask(IplImage*,IplImage*,int); void calcCenterPoint(IplImage*); void makeObjImg(IplImage*,IplImage*); ・・・・・ } [2] //extract 3d points std::vector<Vector3D> Points; Points.clear(); for(int y=0;y<this->ObjDepthMaskImg->height;y++){ for(int x=0;x<this->ObjDepthMaskImg->width;x++){ if(((uchar)this->ObjDepthMaskImg->imageData[this->ObjDepthMaskImg->widthStep * y + x]) > 0){ float X = this->X_points[ObjDepthImg->width * y + x]/100.0f; float Y = this->Y_points[ObjDepthImg->width * y + x]/100.0f; float Z = this->Z_points[ObjDepthImg->width * y + x]/100.0f; if( Z > 0 ){ Points.push_back(Vector3D(X,Y,Z)); } } } }

専門家に質問してみよう