無茶苦茶な初心者がUnityでゲームを作る日記#3
アホで馬鹿でどうしようもない素人がぐっちゃぐちゃになりながらUnityを学んでいく日記です。
6日か7日目。
前回と同様、ものを理解するには人に教えた方がしやすいと聞いたことがあるのでそういう趣旨。
今回はUnityじゃなくてC#基礎。
↑買った参考書
という事で今回は『二日目』という章をやりました。
主にifとswitchです。
個人的にめっちゃプログラミングっぽく感じる項目。
今回はめっちゃ短くなると思う。
で、何がちがうの?
そんでもってまず端的にifとswitch似てるけど何が違うのって話。
わかりやすく例を言うのなら地図を思い浮かべて下さい。
○ifは道路
○switchは道端の自販機
これです。
いや詳細には違うというか、もしゲームで扱うならみたいな感じになると思います。
ただ、僕はこれが近いなあと感じました。
んで、僕はゲーム制作を最終目的としているので、そっちの理解で進めるんですけど、ゲームの内部処理にはif、プレイヤーが弄る外部処理にはswitchで……
例えば、
○制限時間とかゲーム進行、NPCの判定とか。そういうので用いるのが『if』
○アイテム選択とか、プレイヤーが選択操作するのに用いるのが『switch』
というような感じになるかと……
ifのスクリプトのイメージ
これは『ふるい』が近いなと思いました。
まずifという粗目のふるいにかけ
次にelse ifという中目のふるいにかけて
最後にelseという細目のふるいにかけたもの
で、ifは真偽値って言って、これは正しいか正しくないのかって感じで判定するってやつなので……ってか名前見ただけじゃちょっとしっくりこないというか、う~ん真偽ねえ……って感じです。
ゲームに利用するとしたら○○の時は○○するみたいなシチュで使う感じ。けど、イメージがわかない。
なんで、ちょっと作ってみました。と言ってもコマンドプロンプトなんだけどね。で、条件なんだけども……
○条件
・イチゴケーキは好きか?と聞く。
・好きな場合は1、嫌いな場合は2、どちらでもない場合は3
・それ以外の数字を押したら特定の答えを出す。
↓で作ってみた
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sample209_1
{
internal class Program
{
static void Main(string[] args)
{
// キーボードから数値を入力
Console.WriteLine("イチゴケーキは好きですか?");
Console.Write("1:好き 2:嫌い 3うーんまあ貰えるなら");
int num = int.Parse(Console.ReadLine());
if (num == 1)
{
// numが1だった場合の処理
Console.WriteLine("いいですね、結構良いところの物なんですよ♪");
// 飲み物の選択氏
Console.WriteLine("飲み物は何にしましょう?");
Console.Write("1:紅茶 2:コーヒー 3:ジュース");
int drinkChoice = int.Parse(Console.ReadLine());
if (drinkChoice == 1)
{
Console.WriteLine("おお、分かってますね~、やっぱりイチゴケーキには紅茶ですよ");
// 紅茶選んだ時の選択氏
Console.WriteLine("お好きなものを淹れましょう?");
Console.Write("1:ダージリンかなあ 2:アッサムで! 3:王道のアールグレイ!");
int teaChoice = int.Parse(Console.ReadLine());
if (teaChoice == 1)
{
Console.WriteLine("ダージリンですね~");
// ミルクティーにするかどうかの選択氏
Console.WriteLine("ミルクティーにします??");
Console.Write("1:うん! 2:砂糖だけでいいかな 3:ストレートでお願い");
int teatasteChoiceDarjeeling = int.Parse(Console.ReadLine());
if (teatasteChoiceDarjeeling == 1)
{
Console.WriteLine("やっぱこれですよ");
}
else if (teatasteChoiceDarjeeling == 2)
{
Console.WriteLine("大人~");
}
else if (teatasteChoiceDarjeeling == 3)
{
Console.WriteLine("嗜むって感じですね~");
}
else
{
Console.WriteLine("ちゃんと押してくださ~い");
}
}
else if (teaChoice == 2)
{
Console.WriteLine("アッサムですね~");
// ミルクティーにするかどうかの選択氏
Console.WriteLine("ミルクティーにします??");
Console.Write("1:うん! 2:砂糖だけでいいかな 3:ストレートでお願い");
int teatasteChoiceAssam = int.Parse(Console.ReadLine());
if (teatasteChoiceAssam == 1)
{
Console.WriteLine("一気に風味変わりますよね");
}
else if (teatasteChoiceAssam == 2)
{
Console.WriteLine("いいですね~");
}
else if (teatasteChoiceAssam == 3)
{
Console.WriteLine("通って感じですね~");
}
else
{
Console.WriteLine("ちゃんと押してくださ~い");
}
}
else if (teaChoice == 3)
{
Console.WriteLine("お!アールグレイ!私もやっぱりこれなんですよ~");
// ミルクティーにするかどうかの選択氏
Console.WriteLine("ミルクティーにします??");
Console.Write("1:うん! 2:砂糖だけでいいかな 3:ストレートでお願い");
int teatasteChoiceEarlGrey = int.Parse(Console.ReadLine());
if (teatasteChoiceEarlGrey == 1)
{
Console.WriteLine("やっぱりアールグレイならこうでなくちゃ");
}
else if (teatasteChoiceEarlGrey == 2)
{
Console.WriteLine("好み分かれるところ……");
}
else if (teatasteChoiceEarlGrey == 3)
{
Console.WriteLine("ほう、やっぱ香りがダイレクトに伝わりますね~!");
}
else
{
Console.WriteLine("ちゃんと押してくださ~い");
}
}
else
{
Console.WriteLine("今からちょっと雑草刈ってきますね");
}
}
else if (drinkChoice == 2)
{
Console.WriteLine("コーヒーが好きな方は拘りが強そうですよね");
// コーヒー選んだ時の選択氏
Console.WriteLine("お砂糖とミルクは?");
Console.Write("1:両方! 2:砂糖の代わりにハチミツ入れて 3:ブラックで");
int cofeeChoice = int.Parse(Console.ReadLine());
if (cofeeChoice == 1)
{
Console.WriteLine("ブラックで飲む人って舌どうなってるんでしょうね");
}
else if (cofeeChoice == 2)
{
Console.WriteLine("おっ珍しい……");
}
else if (cofeeChoice == 3)
{
Console.WriteLine("ブラックで良いんですか!?苦いですけど……");
}
else
{
Console.WriteLine("泥水と安物のコーヒーって味変わらないらいいですよ");
}
}
else if (drinkChoice == 3)
{
Console.WriteLine("ではオレンジジュースにしましょう、酸味の強いものを");
}
else
{
Console.WriteLine("話を聞いていましたか?");
}
}
else if (num == 2)
{
// numが2だった場合の処理
Console.WriteLine("おっと、ちょっと待っててくださいね……確か冷蔵庫に……");
// 2つ目の選択氏
Console.WriteLine("あったあった!どれにしますか?");
Console.Write("1:チーズケーキ 2:モンブラン 3:ガトーショコラ");
int cakesChoice = int.Parse(Console.ReadLine());
if (cakesChoice == 1)
{
Console.WriteLine("了解しました~♪");
// チーズケーキ選んだ時の選択氏
Console.WriteLine("トッピングはいかが?");
Console.Write("1:じゃあ生クリーム絞ってほしい 2:ジャムかなあ 3:そのままで");
int toppingChoiceCheesecake = int.Parse(Console.ReadLine());
if (toppingChoiceCheesecake == 1)
{
Console.WriteLine("(……生クリームがダメなんじゃ!?)");
}
else if (toppingChoiceCheesecake == 2)
{
Console.WriteLine("私も好きな食べ方です。ラズベリーソースを作っておいて良かった♪");
}
else if (toppingChoiceCheesecake == 3)
{
Console.WriteLine("色々ありますけど、やっぱこれが一番ですね");
}
else
{
Console.WriteLine("これ以上はないでーす");
}
}
else if (cakesChoice == 2)
{
Console.WriteLine("了解しました~");
}
else if (cakesChoice == 3)
{
Console.WriteLine("了解しました~");
// ガトーショコラ選んだ時の選択氏
Console.WriteLine("トッピングはいかが?");
Console.Write("1:じゃあ生クリーム絞ってほしい 2:あの……アイスって 3:そのままで");
int toppingChoiceGateauchocolat = int.Parse(Console.ReadLine());
if (toppingChoiceGateauchocolat == 1)
{
Console.WriteLine("いいですね~もう完成しちゃいましたよ!");
}
else if (toppingChoiceGateauchocolat == 2)
{
Console.WriteLine("おっと、禁断ですよそれは♪");
}
else if (toppingChoiceGateauchocolat == 3)
{
Console.WriteLine("色々ありますけど、やっぱこれが一番ですね");
}
else
{
Console.WriteLine("これ以上はないでーす");
}
}
else
{
Console.WriteLine("ちゃんと選んでください、差し上げませんよ?");
}
}
else if (num == 3)
{
// num3だった場合の処理
Console.WriteLine("なーんか微妙な反応ですね……");
// 2つ目の選択氏
Console.WriteLine("あまり得意でないとか?");
Console.Write("1:うん 2:いいや? 3:うーん");
int Choicesense = int.Parse(Console.ReadLine());
if (Choicesense == 1)
{
Console.WriteLine("あれま、では別のにしましょうか");
}
else if (Choicesense == 2)
{
Console.WriteLine("なんだよもう");
}
else if (Choicesense == 3)
{
Console.WriteLine("うーんってなんだよ");
}
else
{
Console.WriteLine("押し間違えてますよ~");
}
}
else
{
// それ以外の値が入力された場合の処理
Console.WriteLine("あなた挑戦的ですね");
}
}
}
}
めっちゃ長くなってしまった
結構楽しくなって分岐作っちゃった。
ものによっては↓になります。
いいですね~
これがifの使い方で最適なのかはわからないですけど、まあ作れたは作れたんで、皆さんも↑のやつコピペしてやってみてください。
ちょっとしたゲームみたいなもんなので暇つぶしにどうぞ。
んでやっぱりまだ、switchがわからないんですよね。
参考書にはその月が何日まであるのかを答えるscript組んでるけど、なーんか負に落ちないし。
ここはChatGPTに助けを求めよう
んで、さっきのと似たものを組んでもらいました
using System;
namespace ExampleSwitch
{
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("イチゴケーキは好きですか?");
Console.Write("1:好き 2:嫌い 3:うーんまあ貰えるなら:");
int firstChoice = int.Parse(Console.ReadLine());
switch (firstChoice)
{
case 1:
Console.WriteLine("いいですね、紅茶も付けましょう");
Console.WriteLine("飲み物は何にしましょう?");
Console.Write("1:紅茶 2:コーヒー 3:ジュース:");
int drinkChoice = int.Parse(Console.ReadLine());
switch (drinkChoice)
{
case 1:
Console.WriteLine("紅茶ですね、了解しました!");
break;
case 2:
Console.WriteLine("コーヒーですね、了解しました!");
break;
case 3:
Console.WriteLine("ジュースですね、了解しました!");
break;
default:
Console.WriteLine("その選択はありません。");
break;
}
break;
case 2:
Console.WriteLine("おっと、ではチーズケーキにしましょう");
Console.WriteLine("チーズケーキのトッピングはどうしますか?");
Console.Write("1:ブルーベリー 2:ラズベリー 3:なし:");
int toppingChoice = int.Parse(Console.ReadLine());
switch (toppingChoice)
{
case 1:
Console.WriteLine("ブルーベリーですね、了解しました!");
break;
case 2:
Console.WriteLine("ラズベリーですね、了解しました!");
break;
case 3:
Console.WriteLine("トッピングなしですね、了解しました!");
break;
default:
Console.WriteLine("その選択はありません。");
break;
}
break;
case 3:
Console.WriteLine("ほう、あまりお好きじゃ無いですか?");
Console.WriteLine("では、お好きなケーキは何ですか?");
Console.Write("1:チョコケーキ 2:モンブラン 3:シフォンケーキ:");
int favoriteCakeChoice = int.Parse(Console.ReadLine());
switch (favoriteCakeChoice)
{
case 1:
Console.WriteLine("チョコケーキですね、了解しました!");
break;
case 2:
Console.WriteLine("モンブランですね、了解しました!");
break;
case 3:
Console.WriteLine("シフォンケーキですね、了解しました!");
break;
default:
Console.WriteLine("その選択はありません。");
break;
}
break;
default:
Console.WriteLine("あなた挑戦的ですね");
break;
}
}
}
}
わあ、こっちのが見やすい。
じゃあ断然switchの方でいいじゃねえか!
ってことで聞いてみた
うーんわかったようでわからないような。
だとしたら実践あるのみってことで、自販機で任意のボタンを押した時何が出るのかっていうシチュエーションでスクリプトを組んでみる。
switch文を使って何か実行してみる
イメージとしては
欲しい商品の
上から何番目 × 左から何番目
っていう感じで行こうと思う。
んでscriptがこれ↓
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sample_test2
{
internal class Program
{
static void Main(string[] args)
{
// ボタンの代替として数字を入力
// 左から1、2、3...と座標を定める
// 上から段、段、段と座標を定める
// なので1段目の左から1番目を選択する場合11となる
Console.Write("ボタン(数字)を押してください");
int m = int.Parse(Console.ReadLine());
string d = "";
switch (m)
{
case 11:
case 12:
d = "コーラ";
break;
case 13:
case 14:
d = "レモンサイダー";
break;
case 15:
case 16:
d = "お茶";
break;
case 17:
d = "サイダー";
break;
case 21:
case 22:
d = "グレープサイダー";
break;
case 23:
case 24:
d = "オレンジサイダー";
break;
case 25:
case 26:
d = "ピーチジュース";
break;
case 27:
d = "オレンジジュース";
break;
case 31:
case 32:
d = "ハーフサイズコーラ";
break;
case 33:
case 34:
d = "ハーフサイズコーラ・ブラック";
break;
case 35:
d = "ブラックコーヒー";
break;
case 36:
d = "コーヒー・ラテ";
break;
case 37:
d = "コーヒー・微糖";
break;
default:
Console.WriteLine("適切な値を入力してください");
return;
}
Console.WriteLine("あなたは{0}を押したので{1}が購入されました", m, d);
}
}
}
じゃあなんか試しに買ってみるかって感じで
じゃあ、最近は糖尿病も怖いし、ハーフサイズのコーラにでもしましょうかね~
ッピ
ガコン
ってことで、ちゃんと買えました。
今のところ、これはUnityでどういう風にアタッチすればいいんだろうと考えながらも、なんだか楽しくはあります。
もし、これをifで再現しようと思った、結構面倒くさいことになりそうな気がする。
そうでもなかったわ
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sample_test2
{
internal class Program
{
static void Main(string[] args)
{
// ボタンの代替として数字を入力
// 左から1、2、3...と座標を定める
// 上から段、段、段と座標を定める
// なので1段目の左から1番目を選択する場合11となる
Console.Write("ボタン(数字)を押してください: ");
int m = int.Parse(Console.ReadLine());
string d = "";
if (m == 11 || m == 12)
{
d = "コーラ";
}
else if (m == 13 || m == 14)
{
d = "レモンサイダー";
}
else if (m == 15 || m == 16)
{
d = "お茶";
}
else if (m == 17)
{
d = "サイダー";
}
else if (m == 21 || m == 22)
{
d = "グレープサイダー";
}
else if (m == 23 || m == 24)
{
d = "オレンジサイダー";
}
else if (m == 25 || m == 26)
{
d = "ピーチジュース";
}
else if (m == 27)
{
d = "オレンジジュース";
}
else if (m == 31 || m == 32)
{
d = "ハーフサイズコーラ";
}
else if (m == 33 || m == 34)
{
d = "ハーフサイズコーラ・ブラック";
}
else if (m == 35)
{
d = "ブラックコーヒー";
}
else if (m == 36)
{
d = "コーヒー・ラテ";
}
else if (m == 37)
{
d = "コーヒー・微糖";
}
else
{
Console.WriteLine("適切な値を入力してください");
return;
}
Console.WriteLine("あなたは{0}を押したので{1}が購入されました", m, d);
}
}
}
気が滅入って、というかまだまだ自力で変換できないので、ChatGPT君に出力してもらいました。
なるほど、else ifでいいんだ。
けどやっぱ多いけど、これなら条件が付けやすくなるんでないかな、というか、これだったら最初にif文で囲えば、金額の判別がつくんじゃないのか?
試しに
・コーラ ¥160
・レモネード ¥160
・お茶 ¥130
・コーヒー ¥150
って設定することにする。
1時間後
なんじゃこりゃ完成しなくなった。
3時間後
昼飯を食べ終えて、何とか作り終えました。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sample_test3
{
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("1:コーラ¥160");
Console.WriteLine("2:レモネード¥160");
Console.WriteLine("3:お茶¥130");
Console.WriteLine("4:コーヒー¥150");
Console.Write("投入した金額を入力してください");
int m = int.Parse(Console.ReadLine());
string d = "";
//まず投入金額である「 m 」を認識する
Console.WriteLine("投入金額{0}円", m);
//また、10円から認識する、9円以下は認識しない
//認識しない場合、足りない時は『足らない』と表示
if (m < 10) //10より小さいかどうか
{
Console.WriteLine("金額が足りません");
}
//1000円まで、1001円以上は認識しない
//1001円を越えた場合、余りを表示(1500円だったら500円と表示)
else if (m > 1000)
{
int excess = m - 1000; //int excessはおつり
Console.WriteLine("{0}円多いです。投入上限は1000円までです", excess);
//認識したら、『購入したい商品のボタンを入力してください』
Console.Write("購入したい商品のボタンを入力してください");
int pp = int.Parse(Console.ReadLine());
string drink = "";
switch (pp)
{
case 1:
drink = "コーラ";
break;
case 2:
drink = "レモネード";
break;
case 3:
drink = "お茶";
break;
case 4:
drink = "コーヒー";
break;
default:
Console.WriteLine("適切な値を入力してください");
return;
}
Console.WriteLine("あなたは{0}を押したので{1}が購入されました", pp, drink);
int price = 0;
switch (drink)
{
case "コーラ":
case "レモネード":
price = 160;
break;
case "お茶":
price = 130;
break;
case "コーヒー":
price = 150;
break;
}
if (m >= price)
{
int change = m - price;
Console.WriteLine("おつりは{0}円です", change);
}
else
{
Console.WriteLine("金額が足りません");
}
}
else
{
Console.WriteLine("投入金額は{0}円です", m);
}
//認識したら、『購入したい商品のボタンを入力してください』
//認識したら、『購入したい商品のボタンを入力してください』
Console.Write("購入したい商品のボタンを入力してください");
int oopp = int.Parse(Console.ReadLine());
string oodrink = "";
switch (oopp)
{
case 1:
oodrink = "コーラ";
break;
case 2:
oodrink = "レモネード";
break;
case 3:
oodrink = "お茶";
break;
case 4:
oodrink = "コーヒー";
break;
default:
Console.WriteLine("適切な値を入力してください");
return;
}
Console.WriteLine("あなたは{0}を押したので{1}が購入されました", oopp, oodrink);
int ooprice = 0;
switch (oodrink)
{
case "コーラ":
case "レモネード":
ooprice = 160;
break;
case "お茶":
ooprice = 130;
break;
case "コーヒー":
ooprice = 150;
break;
}
if (m >= ooprice)
{
int change = m - ooprice;
Console.WriteLine("おつりは{0}円です", change);
}
else
{
Console.WriteLine("金額が足りません");
}
}
}
}
やはり、まだまだ成長する余力があることは知れた。
んで、switchを完全にわかったわけじゃないんだけども
case 1:
oodrink = "コーラ";
break;
これと、
case "コーラ":
これ
全然ちゃうやん。
なのに、ちゃんと、コーラ買ったらコーラ分のおつり計算されてんのね。
どういう処理なのって感じだけど。
なんかね、caseっていうので"コーラ"っていうのがついてるからなんかできちゃうらしい。
同じ処理が行われるって言ってた。
あー喉乾いたなあ……お、こんなとこに自販機あるじゃーん。やけに品揃えすくねえけどまあええわ
コーラ買おう
まじかよ、5000円しかないんだけど
ま、いっか
ッピ!ごとん!
ってことで、こんなことができるようになりました。
ほんともう、疲れた。
けどできると達成感がすごいね
終わり
今日もゆっくりながらやってみました。
もー何もやりたくない。
けど今はもう大分全体を見ても拒否反応が出る感じはなくなった。
むしろChatGPTに慣れて、質問力が上がった気がする。
そんな感じ
この記事が気に入ったらサポートをしてみませんか?