`for文`内で宣言した変数を`for文ブロック`の外で使えない件
int classNum = 3; // クラス数 int stuNum = 4; // 生徒数 for (int i = 1; i <= classNum; i++) { // 3回繰り返す System.out.println(i + "クラス目"); for (int j = 1; j <= stuNum; j++) { // 4回繰り返す System.out.print(j + "人目の成績を入力してください: "); sum += input.nextInt(); int allStuNum = i * j; ← こ↑こ↓ avg = sum / allStuNum; ← こ↑こ↓ } }
12行目int allStuNum = i * j;
,13行目avg = sum / allStuNum;
をforブロックの外で使おうとすると
「変数が見つからない」エラーになるって話
所感
多分常識過ぎて、だからどんな入門書にも書いてないポイントなんでしょうけど、
知ってないと自分みたいに for文内の変数 i
,j
,allStuNum
をいざ再利用しようとした時、困惑することになる.
`if`文の条件式では`0 < hoge < 10`って書けないらしい
if
文の条件式では0 < hoge < 10
って書けないらしい
0 < hoge && hoge < 10
を使えだとさ...
なお本記事ではjavaを念頭に扱っている、ほかは知らない
どゆこと? 何いってんの?
説明しづらいけど、
ある条件: 0
を超えて10
未満の数字x
を指定したい時
~~あるよね?あるって共感して!~~
これは数学的に0 < x < 10
って書けば、なんとなく言いたいことが伝わるでしょ?
でも、これをこのままjavaに書くと、エラるっていう話
例↓
結論
面倒でも0 < score && score < 60
、変数を2回書いておきましょう
最後に
if (0 < x , x < 10) { }
でも駄目なので、諦めて&&
も書きましょう
Project名、Package名を英字以外使うな!謎エラーの元
IDEを使ったJavaを勉強の中にハマったので、警鐘記事
Project名、Package名を英字以外使うな!謎エラーの元
分かりやすく日本語でえぇやん!? 英語が決まらないし! それでも英語使え
どうしても迷ったら、ネーミングcodicかGoogle翻訳を使え. ↓みたいな謎エラー吐かれるぞ
エラー:Internal error: (java.nio.file.InvalidPathException) Illegal char <?> at index 46: D:/Downloads/Projects/IdeaProjects/imooc/Java入?第一季 java.nio.file.InvalidPathException: Illegal char <?> at index 46: D:/Downloads/Projects/IdeaProjects/imooc/Java入?第一季 at sun.nio.fs.WindowsPathParser.normalize(WindowsPathParser.java:182) at sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:153) at sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:77) at sun.nio.fs.WindowsPath.parse(WindowsPath.java:94) at sun.nio.fs.WindowsFileSystem.getPath(WindowsFileSystem.java:255) at java.nio.file.Paths.get(Paths.java:84) at org.jetbrains.jps.model.serialization.JpsProjectLoader.loadProject(JpsProjectLoader.java:82) at org.jetbrains.jps.model.serialization.impl.JpsSerializationManagerImpl.loadModel(JpsSerializationManagerImpl.java:42) at org.jetbrains.jps.cmdline.JpsModelLoaderImpl.loadModel(JpsModelLoaderImpl.java:50) at org.jetbrains.jps.cmdline.BuildRunner.load(BuildRunner.java:80) at org.jetbrains.jps.cmdline.BuildSession.runBuild(BuildSession.java:265) at org.jetbrains.jps.cmdline.BuildSession.run(BuildSession.java:121) at org.jetbrains.jps.cmdline.BuildMain$MyMessageHandler.lambda$channelRead0$0(BuildMain.java:228) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748)
っていうか、このエラー何?
私が知りたい 色々調べてみたが、これと言って日本語で理解できそうなアンサーが見つかりませんでした.未だにメッセージで何を言われているのかすら謎です.
なんでエラー吐いたの?
A. 学習ユニット毎にフォルダー分けしたかった.
学習のために色々文法学ぶでしょ? 実際、動画講座を見て、Java勉強していたんだけど、動画自体「Java入門シーズン1、シーズン2、シーズン3」の3つのプレイリストに分かれていて、 「Java入門シーズン1」の中でも 第1章、2章、3章、4章に別れているのさ
これ見て、生真面目な人は 1.動画サイト名でフォルダー作って、 2.1の下に Java入門 のサブフォルダを作成して 3.シーズンごとに、更に章毎に細かく分けたい って考えるでしょ?
そして、IDE IntelliJ IDEAを開いて、Project名にサイト名作って、その中でディレクトリー...これに当たるPackageを次々と作っていくでしょ? 結果、変なエラーを吐いて、対処に2,3時間捨てる羽目になるのよ...
原点に戻ってたどり着いた答え.
英語以外使うな!! そして、教わってないことを勝手に「多分(これとあれが似てるから)こうだろ?」で判断して行動するな!! ← 今回の教訓
公式ドキュメント:初めてのJavaアプリケーションを作成する ここにたどり着き、その通りに沿ってProject
とPackage
を作ったら、エラーが消えました.
書いたJavaのコードは一緒.
public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!!"); } }
「ちなみに」 と 「それでも」
Javaではプロジェクト名、パッケージ名、変数名で英語以外、つまり日本語使うこともできる.
それでもエラー原因となる要素を増やすべきではない. 道具の使い方がわからい内は 特に.
パフォーマンスと静的コライダーについて ~そして沈まない動的コライダー~
公式チュートリアル玉転がし 13:14 より。
2回見ても何言ってんのかさっぱりだったので、自分なりに噛み砕きました。
(英字幕で見たほうが理解しやすかったです) 日本語字幕ルー大柴過ぎて意味不
静的コライダーを動かす度、シーン全体の静的コライダーが再計算される様です
Q:コライダーとは?
A:衝突判定してる枠。
Unityでは2種類のコライダーがあります。
1. 静的コライダーstatic Collider
2. 動的コライダーdynamic Collider
静的コライダーは、Unityでは_動かないもの_と定義されています。
動かないので、ゲームが開始して時間が進んでも、_フレーム毎に再計算する必要がない_ですよね?
だからUnityは始めにシーン内領域にある_静的コライダーの全てを計算して、キャッシュに保存_します。
では、静的コライダーをtransform
で回転、移動させてる場合どうなると思います?
見出しの通りです。
重要なのはtransform
させてる静的コライダー1個ではなく、全体が再計算され静的コライダーのキャッシュが更新されている事です。
パフォーマンスはひどく悪いように見えますでしょ?
実際、~~オブジェクトが多いと~~最悪です
どこかの記事で、
仕様:静的コライダー ← 動かしてはならない
とだけ書かれてあって、読んでも「( ゚Д゚)は?」だったのを覚えてる。
多分こういう事を言ってるんだと思う。
じゃぁどうすんの?
何が?って感じだけど、とりあえずみんな思うよね
そして考えるのが「動的コライダーにすれば(とりあえず)ええやん?」ですよね?
(多分)正解!
動画の説明を裏読みをすれば、動的コライダーならば全体ではなく、個別に再計算してるので、パフォーマンスがいいはず。
ではUnityでの動的コライダーの要件とは?
- コライダー
- Rigidbody
この2つを持つゲームオブジェクトを全て動的とみなされます。
つまり、今動かしてるコライダーがあったら、それにRigidbody
を追加してあげれば、とりあえずパフォーマンスが上がるはずです。
そして地獄を見る
見たほうが早い。玉転がし 14:34 をまず見てください。
そう、Rigidbody
を追加すると地球の重力に魂が縛られます。
そしてIs Trigger
がチェックされてるアイテム系オブジェクトだとそのまま沈んで画面外まで消えます。
この悲しみをセーブするためにUse Gravity
のチャックを外します。
これで沈下は免れますが、他の物理現象が依然として働きます。
具体的にはこう↓
2個目以降のアイテムからは分かりやすいようにIs Trigger
外しています
ひとつの冴えたやり方
- 取得可能なアイテムじゃなくって、建物とかの装飾に回転する飾りがほしいだけだったのに…
- ベルトコンベアを実装したかったのに
っという現実的要望もあるかと思います。
アイテムじゃないんだよ!目立つ背景なんだよ!でも動かされるのは困る。的な
そういう時はUse Gravity
とIs Kinematic
の両方にチェックを入れます。
すると
- 空中浮遊設定ならそのまま 地面に沈まない
- 他のオブジェクトと衝突してもふっ飛ばされない
- 動的コライダー でパフォーマンスに優しい
コライダーが出来上がるはずです。
取得可能なアイテムにしたければ、Is Trigger
を付ければ完璧!って感じですね。
最後に
初心者が公式チュートリアルをありのままに読んで、試して、感じた所感です。
現実の開発現場ではもっと違うやり方で同じことをやっているかもしれません。
もし違うやり方でもっと効率のよいアイデアがあれば、ぜひ教えてください。
もちろん記事に勘違いからのミスがありましたらご指摘ください。
最後まで読んでくださってありがとうございました。
UnityEditorでショートカット Ctrl+' が機能しない件
MonoDevelop以外のエディター でCtrl+'
を入力しても公式ドキュメントに飛ばない方へ
時間の無駄だから、今すぐ検索するのヤメロ
代わりに 'Unity API xxxxx' でググったほうが早い
多分Unityの公式チュートリアル「玉転がし」を見て、このショートカットを試したんだろうと思います。
自分はWin10環境でMonoDevelopを入れてなく、JetBrains Riderを使用していたので、ドツボにはまって時間を浪費しました。
そしてこのQ&Aを見るにVisual Studioでも機能しないか、404になる可能性が大かもです。 MonoDevelopでも機能しない可能性が?
以下Riderを使用してる方について
Ctrl+’
に当たる機能はありません。
公式ドキュメント程充実していないけど、軽く確認するくらいなら'Ctrl+Q'を使うといいかも?
~~英語だけど~~
コーディング支援 | |||
---|---|---|---|
コマンド | Visual Studio | ReSharper | デフォルト(IntelliJ IDEA) |
クイック・ドキュメント | Ctrl+Shift+F1 | Ctrl+Q | Ctrl+Q Alt+Right-click |