ヽ|∵|ゝ(Fantom) の 開発blog? ホーム »JavaScript
このページの記事一覧

Java, C#, PHP, Ruby, Python, JavaScript での Math.round(四捨五入・五捨六入)比較  


 先日、言語間で算術関数を含む移植などしてたら、結果が違ってたので改めて調べてみた。「負の値の割り算や剰余」なんかもそうだけど、言語仕様によって値が違ってたりするので、毎回確認するのは面倒なんだよね。せっかくなので、一覧にしていつでも見れるようにしておこうと考えた。


(元の値)
JavaJavaScriptC#Python3RubyPHP
Math.roundMath.roundMath.Roundroundroundround
-2.0-2-2-2-2-2-2
-1.6-2-2-2-2-2-2
-1.5-1-1-2-2-2-2
-1.4-1-1-1-1-1-1
-1.0-1-1-1-1-1-1
-0.6-1-1-1-1-1-1
-0.5 0 0 0 0-1-1
-0.4 0 0 0 0 0 0
0.0 0 0 0 0 0 0
0.4 0 0 0 0 0 0
0.5 1 1 0 0 1 1
0.6 1 1 1 1 1 1
1.0 1 1 1 1 1 1
1.4 1 1 1 1 1 1
1.5 2 2 2 2 2 2
1.6 2 2 2 2 2 2
2.0 2 2 2 2 2 2


 実際の結果は以下の通り。paiza.io で比較した。

Java, C#, PHP でのRound結果
Java, C#, PHP
Ruby, Python, JavaScript でのRound結果
Ruby, Python, JavaScript
(クリックで拡大)

 言語によっては丸め方法のオプションなんかもあるが、そのまま使ってると四捨五入っぽかったり、五捨六入っぽかったり、0からの距離っぽかったり、値の境界が異なるので、複数の言語を使うときには気をつけた方が良いだろう。

 どうしても揃えたければ

 floor(v + 0.5)

のようにする手もある。

 また、「0からの距離でグループ分け」と「等間隔にグループ分け」で使い分けをすることもできるので、知っておいても損はないだろう。

「0からの距離でグループ分け」と「等間隔にグループ分け」
(クリックで拡大)


 まぁ、何にしても、「負の値の演算」「丸め誤差を持つ演算」「0をまたぐ演算」あたりは仕様を確認しておいた方が良いだろう。


(関連記事)
【C#】倍数での Floor, Ceil, Round(一定間隔での切り捨て、切り上げ、四捨五入) [double 版]
【Unity】倍数での Floor, Ceil, Round(一定間隔での切り捨て、切り上げ、四捨五入) [float 版]
【Java】Math.floor(), ceil(), round() 動作互換アルゴリズムを試す



スポンサーサイト

category: プログラミング

thread: プログラミング

janre: コンピュータ

tag: Java  C#  PHP  Ruby  Python  JavaScript 
tb: 0   cm: --

【Unity】【C#】【JavaScript】GUIText をコードで生成する  


 GUIText って、Ver 4.6.x より前は「GameObject」のメニューから直接「GUIText」が作れたのだが、4.6.x 以降は「空の GameObject にGUIText のコンポーネントを追加」して、自分で作るしかないのね。とりあえず以下の参考資料の方法で作ってプレハブ化しておけば良いのだが、色々な資料をみると意外と GUIText を使ったサンプルが多いので、スクリプトで動的に生成するのもアリと思った。というわけで、またしても適当なコード。

↓メニューから作るには、
(参考) Unity4.6以降のGUITEXTとGUITEXUREについて

↓スクリプトで作るには、
●C#
GameObject guiObj = new GameObject("GUI Text");  //Hierarchy に表示される名前
guiObj.AddComponent("GUIText");
guiObj.guiText.transform.Translate(0.5f, 0.5f, 0);
guiObj.guiText.anchor = TextAnchor.MiddleCenter;
guiObj.guiText.alignment = TextAlignment.Center;
guiObj.guiText.fontSize = 24;
guiObj.guiText.fontStyle = FontStyle.Normal;
guiObj.guiText.text = "Text C#";

●JavaScript
var guiObj : GameObject = new GameObject("GUI Text");  //Hierarchy に表示される名前
guiObj.AddComponent("GUIText");
guiObj.guiText.transform.Translate(0.5f, 0.5f, 0);
guiObj.guiText.anchor = TextAnchor.MiddleCenter;
guiObj.guiText.alignment = TextAlignment.Center;
guiObj.guiText.fontSize = 24;
guiObj.guiText.fontStyle = FontStyle.Normal;
guiObj.guiText.text = "Text J";

 書く場所はテキストが固定なら Start() だけで良いが、Update() で内容を変更したいなら、guiObj をグローバルスコープに置けば良い。new GameObject(name) で付ける名前はユニークな方が良いね。

 Canvas の UI Text とは座標系が少し違うから、サンプルごとに調整するのは面倒だしね。スクリプトをコードテンプレート(スニペット)に登録しておくと、いつでも呼び出せる利点もある。

(参考) [MonoDevelop]Snippetsを使って記述を楽にする方法


(関連記事)
【Unity】【C#】【JavaScript】4.6.x の Canvas~UI Text のテキストをコードで変更する
【Unity】【C#】uGUI ドロップダウンの要素をコードで設定と取得、外観のカスタマイズなど

category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: C#  JavaScript  Unityリファレンス 
tb: 0   cm: --

【Aptana】【JavaScript】Aptana Studio 3 の入力補完を編集する  


最近 JavaScript/HTML5 など Web 関連は Aptana Studio 3 を使ってみてるのだが、デフォルトで入っているコードテンプレートというか入力補完というか(MSはインテリセンスと呼んでいた)、微妙に修正したい部分があったので、Eclipse のように設定メニューからコードテンプレートの項目を探したが見つからなかった。調べてみたら「スニペット」を編集してくれとあったのでやってみた。あまり詳しく書かれている資料が見つからなかったので、画像付きで解説。

もし、スニペットのビューが開いてなければ、メニューから「ウィンドウ」-「ビューの表示」-「スニペット」で開き、右クリックから編集もできるのだが、もうちょっとわかりやすく、メニューからやってみる。今回は JavaScript を例にしてるが、他の言語でも変わらないと思う。


1.「コマンド」メニューから「JavaScript」-「Edit this bundle」を実行する。

2.プロジェクト・エクスプローラに「JavaScript [stable]」が開いたら、展開して「snippets」フォルダ内の「snippets.rb」をエディタで開く。


3.Ruby で書かれている(?)ようだが、とりあえず「s.trigger」が入力補完で候補を出すキーワード、「s.expansion」にコードテンプレートを書けば良いらしい。あと、「snippet t(:for)」とか「snippet "for (...)~"」の部分がアシスト(ポップアップの説明)で出てくるので、ユニークなものにしておく。


4.編集が終わったら、ファイルを保存して、「ファイル」メニューから「再開」を実行すれば、Aptana Studio が再起動して、編集した内容が有効になる。もちろん「スニペット」のビューからも使える。


(*) メニューは日本語化してある。


今回はサンプルとして「for ~ in」文を追加してみた。「${1:e}」「${2:Obejct}」のような部分は変数部分になるので、それぞれ適当に変えても良いだろう。とりあえず自分が追加したい構文に近いものをコピペして、適当に変えてみれば何とかなる(笑)。

●JavaScript 「for ~ in」 文 スニペット
  snippet t(:for_in) do |s|
s.trigger = "for"
s.expansion = "for (var ${1:e} in ${2:Obejct}) {
${1:e};
}"
end


余談だが、JavaScript の「for ~ in」文って、Java の「for ~ in」(foreach)とは動作が違うんだよね。配列などをなめるわけではなくて、オブジェクトプロパティをなめるものだったりする。少しまぎらわしいね。Perl や PHP なんかは foreach 構文で連想配列をよくなめることをするね。JavaScript には「forEach」「for each-in」構文などもあるようだが、ブラウザの互換性がないのだとか。まぁ、色々やってみるしかないね。

よく使うメソッドなんかも登録できないことはないね。まぁ、オブジェクトと無関係になってしまうが…。

●JavaScript 「addEventListener(type, listener)」スニペット
  snippet t(:addEventListener) do |s|
s.trigger = "addeventlistener"
s.expansion = "addEventListener(${1:type}, ${2:listener});"
end


私はサクラエディタなんかもよく使ってるけど、自分用の入力補完テンプレート作っておくと、すごく楽なんだよね。


(参考)スニペットの追加
(参考)Aptana Studio の日本語化
(参考)javascriptのfor-in文は、for-each文の代わりじゃない


category: 環境構築

thread: プログラミング

janre: コンピュータ

tag: JavaScript  開発ツール 
tb: 0   cm: --

【Unity】【C#】【JavaScript】4.6.x の Canvas~UI Text のテキストをコードで変更する  


 持っている資料が古いのか、Ver 4.6.x 以降は GUI Text ではなく、Canvas に入れ子になっている UI Text を使う仕様になっていたので、GuiText のプロパティにテキストを設定する方法ではなくなっていた。ネット上にあるサンプルもレガシーのやり方ばかりなので、イマイチ良い資料がない。というわけで適当にやってみたら、上手くいったコード。


 例えば画像のように、Canvas の中に、msg、itemCount、time (それぞれ GameObject - UI - Text で作ったもの)があった場合、

●C#
//宣言部 - 追加
using UnityEngine.UI;

//メインコード部
Text msg = GameObject.Find("Canvas/msg").GetComponent<Text>();
msg.color = Color.red;
msg.text = "COMPLETE!";

Text item = GameObject.Find("Canvas/itemCount").GetComponent<Text>();
item.color = Color.blue;
item.text = "ITEM: " + count; //variable

Text time = GameObject.Find("Canvas/time").GetComponent<Text>();
time.text = "TIME: " + Mathf.Floor(Time.time);

●JavaScript
//宣言部 - #pragma strict のすぐ下あたりに追加
import UnityEngine.UI;

//メインコード部
var msg : Text = GameObject.Find("Canvas/msg").GetComponent("Text") as Text;
msg.color = Color.red;
msg.text = "COMPLETE!";

var item : Text = GameObject.Find("Canvas/itemCount").GetComponent("Text") as Text;
item.color = Color.blue;
item.text = "ITEM: " + count; //variable

var time : Text = GameObject.Find("Canvas/time").GetComponent("Text") as Text;
time.text = "TIME: " + Mathf.Floor(Time.time);

のように書けば、テキストの内容や色などを変更できた。Rich Text として使えばタグも使えるみたいだし、そのうち色々実験してみようかな…。

 Unity ももうすぐ5になりそうだし、進化するのは良いけど、仕様がどんどん変わっていくのは、過去のコードが参考にならないのが辛いね。

 AndEngine なんかも使ってみたけど、メインエンジンのコードの仕様などもどんどん変わっているので、1年以内の資料でも参考にならなかった。cocos2d なんかもバージョンごとに NDK や make などのバージョンも合わせないと上手くいかないしね。Android SDK なんかはわりと古いものも使えるんだけどね。できればフレームワークは上位互換で作って欲しいものだね。でないと最新コード以外どんどん使えなくなる。バージョン変わるたびに書き直すのではフレームワークの意味がないしね。


(関連記事)
【Unity】【C#】uGUI ドロップダウンの要素をコードで設定と取得、外観のカスタマイズなど
【Unity】【C#】【JavaScript】GUIText をコードで生成する


category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: C#  JavaScript  Unityリファレンス 
tb: 0   cm: --


プロフィール

Social

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR

▲ Pagetop