20200710のUnityに関する記事は11件です。

Error: unknown command "filter-proces" for "git-lfs"

概要

作業内容としては、UnityのプロジェクトをAzurePipelinesでCI/CD対応をやってました。
Unityビルド対応は後でiOS/AndroidのProjectビルドをGitにPushして、AzurePipelines標準のiOS/Androidビルドを適応してアプリが正常にビルドと起動ができるのか確認、正常起動のみアプリをAppCenterに配布する想定で進めておりました。

Firebaseを使用しているので、./Assets/Firebase/Plugins/x86_64/FirebaseCppApp-6_8_0.so(約107M)がgit-lfsが必須となりすでに対応は済ませていました。
ですが、ブランチ切り替えての作業でgit lfs trackでtrackedされているファイルが消えたり作られたりすると次のエラーが起き始めていました。
また、まずはiOSビルドを先にAzurePipelines対応しようと作業していたため、Xcodeプロジェクトをgit pushする際に./xcode/libraries/libiphone-lib.a(約602M)もgit-lfs対応していたました。

$ git add .
Error: unknown command "filter-proces" for "git-lfs"

Did you mean this?
    filter-process

Run 'git-lfs --help' for usage.
fatal: The remote end hung up unexpectedly

このエラーについてググってみるものの参考になる記事が全く見当たらなかったので本記事にまとめたいと思います。

解決

結果的にGit LFSの使用方法 - Backlog ヘルプセンター記事の内容を参考になりました!

解決方法はいたってシンプルで、

# もしcommitなりしていたadd前に戻す
$ git reset --hard HEAD^

# `git-lfs`のtracked以外の編集内容を先にpushしておくと安全に作業できる
# ただしCI/CD対応がすでに完了している環境だったらこのpushはエラーになるかもなのでそのときの状況に応じてよしなに
$ git add . && git rm --cached -r ./xcode/libraries/libiphone-lib.a && git commit -m "Upload Xcode Project" && git push

# `git-lfs`の設定をリセットさせるとエラーが無くなった・・・
$ git lfs install
WARNING: The "filter.lfs.process" attribute should be "git-lfs filter-process" but is "git-lfs filter-proces"
Run `git lfs install --force` to reset git config.

$ git lfs install --force
Updated git hooks.
Git LFS initialized.

$ git add . && git commit -m "add git lfs file"
[develop xxxxxx] add git lfs file
 1 file changed, 3 insertions(+)
 create mode 100644 Xcode/Libraries/libiPhone-lib.a

$ git push

原因

今回のミスは2点でした。

  1. .gitattributesgit-lfsのtrackedファイルを一緒にPushしようとしていたこと
  2. Run 'git lfs install --force' to reset git config.を無視していたこと

1はそもそもgit-lfsの使用方法をちゃんと把握していなかったことでした汗
2はリセットする意味が分からず怖くてできなかったんですが、お手上げになったこともありやってみたところエラーは無くなりましたw

まとめ

ちゃんとツールの使用方法を把握しないとですねー

 

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Playを押すたびに"Processing Addressable Group"と表示される。

やあ

備忘です。

あなたのAddressableのソースは毎回[Play!]を押すたびにビルドされてます。
※私はビルドする必要があるかチェックしているのも含めて"ビルド"と呼んでます。

おおきく3つ手順があります。

1.プレイモードの変更
2.プロファイルの設定
3.Addressableのビルド

1.プレイモードの変更

以下のように変更して下さい。
Play Mode Script > Use Existing Build(requires build groups)

changethis.png

2.プロファイルの設定

適当なフォルダにビルドパス、ビルドローカルパスを変更します。
changethis.png

3.Addressableのビルド

Addressableのソース?を変更したら毎回実行してください。
changethis.png

以上です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unity 学習開始

2020.07.10 

以前から気になっていたARアプリやソフトが作りたくて調べていたらUnityに出会いました。
Unityの開発者や参考文献、参考動画が多くあるので進めていくのに露頭に迷わなくて良さそうってのもあります。

今日からUnity学習を始めます。(宣言しないと進められないので(笑))

学習参考URL
ユニティちゃんが教える!初心者向けUnity講座
https://www.udemy.com/course/unity-chan-tutorial-01/
今日からはじめるUnity
https://qiita.com/nmxi/items/7950fb12ef925efa276d
Unity初学者用URL集
https://qiita.com/nori0__/items/e03635481318dc983b9a

他にも参考になるサイト、ページがあれば教えてください。

Qiitaの先生、先輩よろしくお願します。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Substance PainterでエクスポートしたテクスチャをUnityに取り込む

やりたいこと

Substance Painterで3Dペイントしたテクスチャをエクスポートして、Unityに取り込みます。

流れ

  1. オブジェクトを入れるフォルダを作成する
  2. オブジェクトを取り込む
  3. マテリアルを取り込む
  4. テクスチャを入れるフォルダを作成する
  5. マテリアルを取り込む
  6. ノーマルマップのテクスチャタイプを変更する
  7. オブジェクトにテクスチャを割り当てる
  8. シーンに地面を配置する
  9. シーンにオブジェクトを配置する
  10. カラースペースをLinerに変更する

詳細

1. オブジェクトを入れるフォルダを作成する

ProjectウィンドウのAssetフォルダ内で右クリックして、Create -> Folderを選択します。名称をObjectsに変更します。
image.png

2. オブジェクトを取り込む

Objectsフォルダ内に移動し、右クリックして、Import New Assetsを選択します。Substance Painterで作成したfbxデータを取り込みます。
image.png

3. マテリアルを取り込む

取り込んだオブジェクトをクリックし、InspectorウィンドウのLocationをUse External Materials (Legacy)、NamingをFrom Model's Materialにして、Applyボタンを押します。自動でMaterialsフォルダが作成され、中にマテリアルが保存されます。
image.png

4. テクスチャを入れるフォルダを作成する

ProjectウィンドウのObjectsフォルダ内で右クリックして、Create -> Folderを選択します。名称をImagesに変更します。

5. マテリアルを取り込む

Imagesフォルダ内に移動し、右クリックして、Substance Painterからエクスポートしたテクスチャをドラッグ&ドロップします。

6. ノーマルマップのテクスチャタイプを変更する

5で取り込んだノーマルマップをクリックし、InspetorウィンドウのTexture TypeをNormal Mapに変更し、Craete from Grayscaleをオフにし、Applyボタンをクリックします。
image.png

7. オブジェクトにテクスチャを割り当てる

3で作成されたMaterialsフォルダの中のマテリアルをクリックし、Main MapsのAlbedo、Metallic、Normal Map、Occulusion、Detail Maskの左の丸ボタンをクリックして、さきほど取り込んだ画像を割り当てます。
Albedo : XXXX_AlbedoTransparency.png
Metallic : XXXX_MetallicSmoothness.png
Normal Map : XXXX_Normal.png
Occlusion : XXXX_AO.png
image.png

8. シーンに地面を配置する

HierarchyウィンドウのCreate -> 3D Object -> Plane の順にクリックして、地面のオブジェクトを作成します。

9. シーンにオブジェクトを配置する

Projectウィンドウのcubeオブジェクトをシーンにドラッグ&ドロップして、シーンにオブジェクトを配置します。
image.png

10. カラースペースをLinerに変更する

メインメニューのEdit -> Project Settings -> Player -> Other Settings -> Color SpaceをGammmaからLinerに変更します。これでよりリアルになりました。
image.png
image.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unity上でPlayボタンを押すとオブジェクトの色が変わるスクリプト

やりたいこと

Unity上でPlayボタンを押すと、立方体の色が青からオレンジに変わるスクリプトを作成します。

Unityの画面構成、マウス操作、C#の基本などは以下の投稿を参考にしてください。
Unityとc#の超入門 ~基礎編~

流れ

  1. オブジェクトを作成
  2. マテリアルを作成
  3. オブジェクトにマテリアルを追加
  4. スクリプトを追加
  5. スクリプトを編集
  6. 実行ボタンを押すと、オブジェクトの色が変わる

詳細

1. オブジェクトを作成

HierarchyウィンドウのCreate -> 3D Object -> Cube の順にクリックして、立方体のオブジェクトを作成します。
image.png

2. マテリアルを作成

ProjectウィンドウのAssetsフォルダ内で右クリックし、Create -> Materialを選択します。名称をtest_materialに変更します。
image.png

3. オブジェクトにマテリアルを追加

test_materialを、HierarchyウィンドウのCubeにドラッグ&ドロップします。これで、マテリアルをオブジェクトに結び付ける(アタッチする)ことができました。

4. スクリプトを追加

HierarchyウィンドウのCubeをクリックし、InspectorウィンドウのAdd Component -> New Scriptを選択します。名称を変更し、Create & addをクリックします。スクリプトが生成されました。
image.png

5. スクリプトを編集

生成されたスクリプトcolor_changeをダブルクリックし、Visual Studioを起動、以下のソースに変更し、保存します。
image.png

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class color_change : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        // // 赤色に変更する
        gameObject.GetComponent<Renderer>().material.color = Color.red;
    }

    // Update is called once per frame
    void Update()
    {

    }
}

6. 実行ボタンを押すと、オブジェクトの色が変わる

Unityに戻り、SceneビューにあるPlayボタンを押します。オブジェクトの色が赤に変わりました。
image.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Virtual Chara開発 - その5

店舗接客などに使える仮想のキャラクターが扱えるアプリ開発をしました。そちらの説明はこちらになります。
https://qiita.com/NestVisual/items/fe4dd168178e27156682

環境:
Windows 10
Unity 2018.4.1
RealSense D435i

キャラのアニメーション:

利用者の骨格が検出されなかったり、カメラと利用者の距離が遠すぎたり近すぎたりなど、様々な理由で骨格トラッキングが反映されないときに、モデルはその場で止まってしまいます。これは人形のように見えます。そして、モデルが不自然な状態にある場合は特に悪い。

これを変更するには、まずモデルの四肢の回転を元の状態にリセットしました。Quaternion.Lerp() メソッドを使用すると、スムーズに動きましたが、人間らしくありませんでした。人間は完全に静止していることはほとんどないので、少しだけ揺れる待機状態のループ再生アニメーションが必要だと思いました。

最大の問題は、モデルのトラッキング反映ポーズから、アニメーションの開始ポーズまでを自然に移動させることでした。単純にアニメーションを再生するだけでは、急に変化してしまいます。

現行のプロジェクトでは、アニメーションはすぐに再生されます。そして、再生前の四肢の回転を保存します。これからLateUpdate()でまたLerp()を使用して、関節の回転を設定します。これを行うには、Quaternion.Slerp()を使用します。これは2つの回転と、それらの影響を決定するブレンド比を受け取ります。この比率は、アニメーションの再生が始まったからの経過時間を基準にしています。保存した回転の影響が徐々に少なくなっていきます。

sample1.cs
private void LateUpdate()
{ BlendToMecanim(); }

/// <summary> トラッキング反映からスムーズにMecanimにブレンド移行。Mecanimによってオーバーライドされないように、LateUpdateで呼ぶ </summary>
private void BlendToMecanim()
{
    _animator.SetBool("Idle", false);
    if (STATE != ControlState.BLEND_TO_ANIM)    return;

    // Mecanimに移行したら過ごした時間
    float timePassed = Time.time - reflectTrackingEndTime;                             
    // どれぐらい最後のトラッキングポーズを表す
    float trackingBlendRatio = 1.0f - timePassed / trackingToMecanimBlendTime; 
    // 0から1まで
    trackingBlendRatio = Mathf.Clamp01(trackingBlendRatio);

    // 関節をtrackingBlendRatioぐらいで最後のトラッキング回転にオフセットする
    foreach (KeyValuePair<nuitrack.JointType, Quaternion> rotation in _jointRotationsBeforeMecanim)
    {
        ModelJoint modelJoint = _jointsRigged[rotation.Key];
        modelJoint.bone.rotation = Quaternion.Slerp(modelJoint.bone.rotation, rotation.Value, trackingBlendRatio);
    }

    if (trackingBlendRatio == 0)    STATE = ControlState.ANIMATED;
}

上記プログラムでは、カメラのトラッキングデータを、キャラのアニメーションに反映させます。同じシステムを他のアニメーションにも使用ができます。例えば、複雑な手のジェスチャーのようなトラッキングが難しいものです。BlendToMechAnimメソッドがUpdate()ではなくLateUpdate()で呼ばれるのは、アニメーションの次のフレームが更新されたの後に回転を設定するためです。Updateを使用した場合、アニメーションはブレンドされた回転を上書きしてしまいます。同じスクリプトには 「ControlState」という列挙もあります。これはキャラクターが骨格トラッキング、Unityでのアニメーション(mecanim)、mecanimに向かってブレンドされているときの状態を持っています。

次回はフェイストラッキングで顔を操るに関して投稿します。それではまた

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unityでスクリプトを作成し、Hello, Worldを表示する

やりたいこと

Unity上で実行ボタンを押すと、Hello, Worldが表示されるスクリプトを作成します。
Unityの画面構成、マウス操作、C#の基本などは以下の投稿を参考にしてください。
Unityとc#の超入門 ~基礎編~

流れ

  1. オブジェクトを作成
  2. スクリプトを作成
  3. ゲームオブジェクトを作成
  4. スクリプトをアタッチ
  5. スクリプトを編集
  6. Hello Worldを表示

詳細

1. オブジェクトを作成

HierarchyウィンドウのCreate -> 3D Object -> Cube の順にクリックして、立方体のオブジェクトを作成します。
image.png

2. スクリプトを作成

Projectウィンドウ内で右クリックし、Create -> C# Scriptを選択します。Scriptの名称をtestに変更します。
image.png

3. ゲームオブジェクトを作成

スクリプトを動かすには、何らかのゲームオブジェクトと結びつける(アタッチする)必要があります。作成したスクリプトを動かすためにゲームオブジェクトを追加します。
HierarchyウィンドウのCreate -> Create Emptyを選択します。
image.png

4. スクリプトをアタッチ

testスクリプトを、HierarchyウィンドウのGameObjectにドラッグ&ドロップします。これで、スクリプトをゲームオブジェクトに結び付ける(アタッチする)ことができました。
image.png

5. スクリプトを編集

testスクリプトをダブルクリックすると、Visual Studioが起動し、スクリプトを編集できるようにになります。Hello, Worldと表示されるよう10行目にソースコードを追記します。Visual Studio上でスクリプトを保存します。
image.png

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class test : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Debug.Log("Hello, World");
    }

    // Update is called once per frame
    void Update()
    {

    }
}

6. Hello Worldを表示

Unityに戻り、SceneビューにあるPlayボタンを押します。ConsoleウィンドウにHello, Worldが表示されました。
image.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

自分でゲームを作る一歩目

はじめに

『ゲームを作りたいけど、どこから手を付けたらいいのかわからない』そんなUnity初学者の人たちに、ゲームの構成要素という視点からオリジナル制作の一歩目を示せたらと思います。

ゲームを構成する要素

ビデオゲームに関わらず、いかなるゲームも物語ルールによって成り立っています。
物語はキャラクターやBGM、背景やストーリーによって表現され
ルールはプレイヤーの入力に対するレスポンス(ゲームの世界における因果律)として表現されます

ルールと物語はお互い切っても切り離せない関係にあります。
そして、この組み合わせにおける妙こそがある意味ゲームの醍醐味なのかもしれません。

学習はルールからはじめよう

これはあくまで持論ですが、初学者の人はルールに関する学習からゲーム作りを進めるといいかもしれません。
ゲームとしておなじみの横スクロールや、シューティングゲーム、ブロック崩しや五目並べなどのルールがどのように実装されているのか知ることは、作成できるゲームの幅を広げてくれます。

一方で物語を構成する要素は多く、その一つ一つが人生をかけて極めるに足るものです。加えて、その一つを極めたとしてもゲームの全体像はみえてきません…(例えば一流の音楽家がゲームを作れるかというと、そうではないですね)

物語の作成に求められる能力:グラフィック、音楽、UIUX、ストーリー、アニメーションなどの制作スキル
ルールの作成に求められる能力:コーディング、Unityというフレームワークの理解

ルールを学ぶには

ルールを学び、コーディング能力とUnityの理解を高めるためには実際にゲームを作成することが大切です。
そして実際にゲームを作る一歩目としては、Unity公式の完成ゲームを用いる。もしくは、YouTubeの解説動画をみながらよくあるゲームの模写をするのが最適です。
YouTubeの解説動画の中ではスタジオしまづさんのサイトはとてもおすすめです。

Tofuを恐れないで

ゲームのルールを学習する為に、デフォルトオブジェクトのCubeを利用してゲームをを作ることは何も間違っていません。まずはルールを実装することを意識して、Tofuを使って使って使い倒しましょう。スクリーンショット 2020-07-10 3.46.47.png世界で一番使われてきたObject=Tofu
スクリーンショット 2020-07-10 3.46.55.png
Tofuでゲームを作ってもいいじゃない

物語の味付けはAssetStoreで

ルールがしっかりと実装できたら、物語に欠かせないグラフィックやアニメーションはAssetStoreで補うのがいいでしょう。最初は無料のものから、慣れてきて少しお金を出してもいいと思えるようになったら有料のものを使うのもいいです。
スクリーンショット 2020-07-10 3.54.12.png

最後に

本記事は自分自身がUnityを触る中で感じたこと、GeekSalonというプログラミングスクールで生徒さんのミニゲーム作成に携わってきた経験、そしてゲームに関する名著:Half-Realにインスパイアされた考えに基づき、つらつらと書き殴ったものです。ご意見や間違いの修正などはコメント欄へいただけると嬉しいです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Unity Editor拡張]ゲーミングUnityを作った

はじめに

ゲーミングUnityとは、皆さんご存じのゲーミングPCが七色に光るアレのUnityバージョンです
Editor拡張を使用して作成しました
開発効率が上がるとかそういう内容は一切ありません

結果

demo.gif

ダウンロードはこちら

unitypackageになっています

https://github.com/kyourikey/GamingUnityEditorExtension/releases

環境

  • Windows 10
  • Unity 2018.4.19f1

解説

やっている事はシンプルです

  1. ウィンドウを作成して表示
  2. 虹色グラデーション画像をスクロールさせながら表示
  3. UpdateでRepaintを呼び再描画

おわりに

短いコードで気軽に作れるので、皆さんもEditor拡張でUnityの見た目を自分好みにカスタマイズしちゃいましょう!

おまけ

以前私が書いたEditor拡張の記事です
今回作ったものと近い内容なので、興味が有ればこちらもどうぞ!

こんな感じのUIがUnity上に表示できるEditor拡張です
CircularRotation.gif

参考サイト

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unityで画像からobj形式ファイル作成

pngやjpegの画像をobjにしたいがさくっとする術が見つからん。。

Unityできたけど
ちょっと忘れそう、かつ、またはまりそうなので備忘録

手順

画像を反映したMaterialを用意

unityのProjectビューの任意の場所にお目当ての画像をドラッグ&ドロップ
image.png

projectビューの任意のフォルダで右クリックから新規マテリアル作成

右クリック > Create > Material
image.png

で、そのMaterialのInspectorビューからShaderを変更
Diffuseで検索したら出てくる「Mobile/Diffuse」にする

で下記画像の様になっているので↓
image.png
赤枠のところにお目当て画像をドラッグ&ドロップする

こんな感じで画像はいったの確認できる↓
image.png

ただこの状態だとなんか灰色がかった状態になってしまう。
そこで更にShaderを変更するとそれが回避出来る
UI > Defaultを選択する
image.png

これでMaterial完成

Materialを反映する3Dオブジェクト作る

HierarchyビューでPlaneオブジェクト作ってよしなにする。
とりあえず縦向けたかったり、サイズ適当に調整してこんな感じ
image.png

Materialを3Dオブジェクトに反映する

先ほど作ったMaterialを、これまた先ほど作ったPlaneオブジェクトにドラッグ&ドロップする反映される
image.png

したらいい感じの3Dオブジェクト出来上がり
image.png

UniVRMでglb形式でエクスポートする

UniVRMをインポートしてないひとは探してインポートしてください。

インポートしてれば画面上の方にVRMボタンがあるので
image.png

UniGLTF 1.28 > Export で適当に名前を付けてglb形式のファイルを無事出力。

これで完成よ。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unity (C#) で小数点型の変数をintにキャストすると意図した値にならない(ように見える)ことがある

座標値をint型にする処理

int x = (int)hit.collider.gameObject.transform.position.x;
Debug.Log("x1=" + hit.collider.gameObject.transform.position.x);
Debug.Log("x2=" + x);

Unityで書いてしまいそうな処理があります。
例えば、ボードゲーム系のゲームを作ろうとしたときに、クリックしたマスのボード上の座標を求めたいみたいなものがあると思います。

hit.collider.gameObject.transform.position.xは2.0になっているつもりです。

intにキャストしているため、小数点以下は切り捨てになるはずなので2.5なら2や3.0なら3になってほしいわけですが..

image.png

このような結果になりました。

これは(原因を知らないと)おかしいと思ってしまいますね。
こういうので初心者さんが挫折してしまう理由にもなりかねないんですよね。

ちなみに、キャストは四捨五入なんじゃないかとも言われそうですが
仕様としても切り捨てです。(厳密に言うと0に近い整数値)

https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/builtin-types/numeric-conversions

原因を調べる (ToString)

初心者だと、なかなか発想が浮かびにくいですが、そもそもこの値は2.0じゃないのではないかという発想になりますが、これを検証するのは知らないとなかなか難しいです。

デバッガでステップ実行しても、デバッガの表示も ToString()での値になるので生の値がわかりません。

ちなみに、Unityのposition.x などは float型 つまり System.Single 型です。

ドキュメントを見てみると、ToString()は ToString("G")の省略形のようですね。

https://docs.microsoft.com/ja-jp/dotnet/api/system.single.tostring?view=netframework-4.8#System_Single_ToString

"G" を見てみると、7桁の精度しかないようです。

https://docs.microsoft.com/ja-jp/dotnet/standard/base-types/standard-numeric-format-strings#the-general-g-format-specifier

System.Single 型のドキュメントを見ると、

既定では、戻り値の精度は7桁のみですが、内部的には最大9桁が保持されます。

とあるので、9桁を出して見ると..

Debug.Log("x1=" + hit.collider.gameObject.transform.position.x.ToString("G9"));
Debug.Log("x2=" + x);

image.png

これで謎が少し解決しそうですね。

ということで表示上は2になってしまうが、実は1.99999967だったみたいです。

ちなみに

Debug.Log("x2=" + x);

というのも、実は ToString が勝手に補完されます。

Debug.Log("x2=" + x.ToString());

ところで、ToString()はなんで切り上げになったのか

https://docs.microsoft.com/ja-jp/dotnet/standard/base-types/standard-numeric-format-strings

精度指定子によって結果文字列内の小数部の桁数を制御する場合、結果文字列では無限に正確な結果に最も近い表現可能な結果に丸められた数値が反映されます。 同じように近い表現可能な結果が 2 つある場合は、次のようになります。
.NET Framework および .NET Core 2.0 までの .NET Core の場合、最下位の数字が大きい方の結果が選択されます (つまり、MidpointRounding.AwayFromZero が使用されます)。
.NET Core 2.1 以降の場合、ランタイムでは最下位の数字が同一である結果が選択されます (つまり、MidpointRounding.ToEven が使用されます)。

とあります、

            float f = 1.99999976f;
            Console.WriteLine(Math.Round(f, 6, MidpointRounding.AwayFromZero));

というような処理が行われていると想像できます。
つまり丸められて切り上げになったんですね。

つまり

   class Program
    {
        static void Main(string[] args)
        {
            float f = 1.99999976f;

            Console.WriteLine(f);
            Console.WriteLine((int)f);

            Console.WriteLine(f.ToString("G9"));

        }
    }

2
1
1.99999976

という結果になります。

そもそも、そんな細かい値を使うの?

と思うかもしれませんが、UnityでGameObjectを作ったら、座標がランダムっぽい値で生成されるときがあります。

image.png

これをとくに気にせずに親のオブジェクトとして

Instantiate(guide , new Vector3(2, 0, 0) , Quaternion.identity, guideList.transform);

のようなオブジェクトを作ると (2, 0, 0) はグローバル座標なので

image.png

生成後はこのようなローカル座標になります。

Unityはグローバル座標ではなく、どうもローカル座標から足し引きで求めているようで、本題のような微妙な座標値になることがあります。

なので上の座標値を (0,0,0) にするだけでも本題のバグが発生しない可能性が高いです。

ちなみに
transform.position はグローバル座標で
transform.localPosition は ローカル座標です。(インスペクタに表示されるのもこっち)

まとめ

(int) でキャストして切り捨てにすると意図しない挙動になる場合があるので

float f = 1.99999976f;
int x = (int) Math.Round(f);

のように四捨五入するのが安全かなと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む