20211125のC#に関する記事は7件です。

UnityでWwiseの音を鳴らす 2(Unity組み込み編)

UnityでWwiseの音を鳴らす 1の続きです。 UnityとWwiseをIntegrateする Wwise LauncherのUnityタブからIntegrate Wwise into...からIntegrateを進めていきます。 Integrate時は、UnityとWwiseは終了しておいてください。 Wwise Project Pathでは前回作成したWwise Projectを選択します。 Integrate出来たらUnityプロジェクトとWwiseプロジェクトを起動します。 Unityから音を鳴らす いよいよUnityからWwiseを制御していきます。 Integrate出来ていればUnityのWindowメニューからWwise Pickerが開けるようになっていると思います。 SoundBankのロード 適当にオブジェクトを作るなりして、Inspectorから「Ak Bank」を追加します。 Nameのところから作成したSoundBankを選択します。 このAk BankでSoundBankをロードさせないと一切音が鳴りません。 (今回は関係ありませんが、実際の実装ではどのSoundBank読み込ませる読み込ませないとかで軽量化や効率化を図ります) スクリプトからEventを再生させる(ポストする) EventをポストするScriptを書きます。 using System.Collections; using System.Collections.Generic; using UnityEngine; public class WwisePost : MonoBehaviour { public AK.Wwise.Event Event;//宣言 void Start() { Event.Post(gameObject);//Eventの再生 } } 単純にスクリプトから音を鳴らすだけなら2行書くだけです(超簡単) 作ったスクリプトと「Ak Game Obj」スクリプトを音を鳴らしたいオブジェクトに付けます。 ※AkGameObjはWwise内の位置計算に使われるものです あとはEventの欄に鳴らしたいEventを登録してあげればOK Gameを再生すると音が鳴るはずです。 今回は分かりやすいようにStart関数に入れましたが、Eventのポストをお好きな位置に入れれば任意のタイミングで再生できます。 おわりに 無事UnityとWwiseで音が鳴らせるようになったはずです。 ここで紹介したのは本当に初歩的なことなので、複雑な制御については今後追加で記事を書いていきます。 Wwiseならではのインタラクティブな実装方法までいけたらなーと。 参考文献 Wwise 101 Wwise 301
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

UnityでWwiseの音を鳴らす 1(Wwise編)

はじめに UnityとWwiseの連携は、Audiokinetic公式からもチュートリアルが用意してありますが、関係ないチュートリアルも一緒に読まないと理解出来なかったり、異なるチュートリアルを行ったり来たりしないといけないので、 「手早くUnityとWwiseのを連携をやってみたい!」「触りながら勉強していきたい!」という方のため書き連ねておきます。 ※Wwiseは前回の大型アプデでUIが変わったり、機能が増えてたりするので今から初めて触り始める人に役立てばいいなと。あと自分用のメモ 今回はUnity側からスクリプトでWwiseの再生指示を出すところまでを目標にやります。 環境情報 MacOS Catalina(10.15.7) Unity 2020.3.19f1 Wwise 2021.1.4 ※MacOSを想定していますが、Windousでもほぼ同じだと思います。 Wwise側の準備 Wwise LauncherからWwiseを起動して「New...」からプロジェクトを作ります。この記事では「Wwise_Qiita」としておきます。(一部黒塗りがありますがご了承ください) Name,Locationはお好みで。 Platformは開発したい環境を選んでください、今回はMacオンリー。 Assets(プラグイン類)は今回は使う予定がないので全部チェック外しました。 必要になったらその時入れればいいしね。 Audioデータを読み込む LayoutsタブのDesignerレイアウトで作業していきます。 Default Work Unitを選択してSound SFXを作ります。名前は何でもいいですが、ここでは「TestSound」としておきます。 作ったSound SFXを右クリックし、import audio fileから開けるタブで、鳴らしたい音声ファイルを読み込みます。 先程まで赤い文字だったSound SFXが青色になればOK Eventを作る Eventタブに移動して、Default Work Unitを選択してEventを追加します。 名前は何でも良いですが、Unity側からこのEvent名を呼び出すことになるので管理しやすい名前をおすすめします。 作成したEventに先程作成したAudioデータをドラッグして登録します。 登録の方法やEventタイプは他にもあるので、詳細を知りたい方は公式のチュートリアルを確認すると深まるかと思います(https://www.audiokinetic.com/ja/courses/wwise101/?source=wwise101&id=applying_an_action#read ) 今回は一番基本的なEventで進めていきます。 SoundBankを作ってビルドする SoundBankタブに移動して、Default Work Unitを選択してEventを追加します。 こちらも名前は何でもいいですが、ここでは「MainSoundBank」としておきます。 ここからはLayoutsタブのSoundBankレイアウトで作業していきます。 先ほど作成したSoundBankにEventをドラッグアンドドロップして追加します。 最後にGenerate Allか、Generate SelectedでビルドするSoundBankを選んでビルドすればWwise側の操作は終了です。 基本的には「Audioを登録する→Eventを作ってAudioを登録する→SoundBankに登録する→ビルドする」の工程を繰り返していけばOKです。 続き↓ UnityでWwiseの音を鳴らす 2
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【C#】Head First デザインパターンでオブジェクト指向の勉強

デザインパターン1章 一番わかりやすく読みやすかったのでこの本でオブジェクト指向を勉強していきます。今回は一章のアヒルの例です。 マガモやゴムアヒルを作るのに基本となるアヒルクラスを作って継承させるのはどう??というのから始まってそれじゃだめだからインターフェイスで。 この形でも作るアヒルによってFlyableの中身を書いてあげないといけないから結局メンテが大変。ゴムのアヒルはそもそも飛べない。 それならFlyBehaviorという名前のインターフェイスを作ってカプセル化してあげれば変更に強くなるので動的に挙動を変えることもできるかも!?というお話です。ここでは翼で飛ぶまたは飛べないというクラスを作ってマガモであれば飛ぶという選択を、ゴムアヒルであれば飛べないという挙動を選ぶことができる。 Program.cs using System; namespace HeadFirstEx1 { class Program { static void Main(string[] args) { MallardDuck mallard = new MallardDuck(); mallard.performFly(); mallard.performQuack(); RubberDuck rubber = new RubberDuck(); rubber.performFly(); rubber.performQuack(); } } public abstract class Duck { public FlyBehavior flyBehavior; public QuackBehavior quackBehavior; public Duck() { } public abstract void display(); public void setFlyBehavior(FlyBehavior fb) { flyBehavior = fb; } public void performFly() { flyBehavior.fly(); } public void setQuackBehavior(QuackBehavior qb) { quackBehavior = qb; } public void performQuack() { quackBehavior.quack(); } public void swim() { Console.WriteLine("Swim"); } } public interface FlyBehavior { void fly(); } public class FlyWithWings : FlyBehavior { public void fly() { Console.WriteLine("I am flying."); } } public class FlyNoWay : FlyBehavior { public void fly() { Console.WriteLine("I cannot fly."); } } public interface QuackBehavior { void quack(); } public class Quack:QuackBehavior { public void quack() { Console.WriteLine("Quack"); } } public class Squeak : QuackBehavior { public void quack() { Console.WriteLine("Squeak"); } } public class MuteQuack : QuackBehavior { public void quack() { Console.WriteLine("<< Silence >>"); } } public class MallardDuck: Duck { public MallardDuck() { setFlyBehavior(new FlyWithWings()); setQuackBehavior(new Quack()); } public override void display() { Console.WriteLine("I am a MallardDuck"); } } public class RubberDuck : Duck { public RubberDuck() { setFlyBehavior(new FlyNoWay()); setQuackBehavior(new Squeak()); } public override void display() { Console.WriteLine("I am a rubber duck"); } } } 結果はこのようになります もともとは飛ばないゴムアヒルを無理やり飛ばすにはこのようにsetFlyBehaviorにFlyWithWingsクラスを与えてやると飛びます。 static void Main(string[] args) { MallardDuck mallard = new MallardDuck(); Console.WriteLine("MallardDuck"); mallard.performFly(); mallard.performQuack(); Console.WriteLine("RubberDuck"); RubberDuck rubber = new RubberDuck(); rubber.performFly(); rubber.performQuack(); Console.WriteLine("------------------------"); rubber.setFlyBehavior(new FlyWithWings()); rubber.performFly(); } しっかりと飛べました。 次回は2章です。 追記 @shiracamus さんよりインターフェース使用方向の指摘、plantUML図の編集をしていただきました。ありがとうございます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【C#】親Formを最新の状態に更新する

前提条件 ・メイン画面(MainForm)、親画面(ParentForm)、子画面(ChildForm)という3種類のFormがある。 ・メイン画面を閉じると、アプリケーション自体が終了する。 ・親画面には、開いた時から、DBから取得したデータが表示されている。 ・子画面からは、親画面に表示されている情報に対して変更を加えることができる。 ・メイン画面には、親画面を開くボタンを設置している。 ・親画面には、子画面を開くボタンを設置している。 実現すること 子画面を閉じると、親画面に表示されているデータが最新のものに更新される。 方法1 DBから最新のデータを取得し直し、DataGridViewのDataSourceを上書きする。 親画面のボタンクリック時 ParentForm.cs private void OpenChildBtn_Click(object sender, EventArgs e) { //子画面を開く new ChildForm().ShowDialog(); //子画面が閉じられたら、表示データを更新する DataTable dt = SqlManager.GetData(); dataGridView1.DataSource = dt; } 方法2 現在開いている画面(ParentFormインスタンス)を閉じ、新しい画面(ParentFormインスタンス)を開く。 この時、先に開いていたParentFormと同じ位置に新しいParentFormを表示することで、 あたかも元の画面が更新されたかのように見せる。 方法1で対応できない場合に使用。 方法1と異なるのは、TextBoxに入力されていた値等もすべて消え、完全に初期状態に戻る点。 親画面のボタンクリック時 ParentForm.cs private void OpenChildBtn_Click(object sender, EventArgs e) { //子画面を開く new ChildForm().ShowDialog(); //子画面が閉じられたら、自分自身を閉じる this.Close(); //閉じた自分自身の表示位置(x座標,y座標)を取得する Point currentLocation = this.Location; //新しい親画面を開く ParentForm newParentForm = new ParentForm(); newParentForm.Show(); //新しい親画面を閉じた画面と同じ位置に表示する newParentForm.Location = currentLocation; } 以上
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

C#でWeb UIが開発できるBlazorのご紹介

Blazorとは? C#でWeb UIが開発できるフレームワークで、Javascriptの代わりに.NETとC#を使って、リッチでインタラクティブなWeb UIを構築可能です。Razorコンポーネント単位で画面の部品を構築していくため、再利用性が高いです。C#で実装しますが、Javascriptとの相互運用も可能です。(C#からJavascriptの処理を呼び出すことができますし、その逆も可能です。) Blazorの種類 Blazor WebAssembly WebAssemblyを利用することにより、Web ブラウザー内で .NETのコードを実行することが可能になります。ランタイムと共にバイナリコードがブラウザにダウンロードされ、UIイベントが発生するとブラウザ上で直接実行されます。サーバーサイドの構築が必要ないため、純粋な静的サイトとして展開可能です。 Blazor Server RazorコンポーネントをAsp.net Coreサーバー上でホストして動作するBlazorアプリケーションです。 WebサーバーとWebSocket(SignalR)で通信することにより、Web UIを動的に構築します。そのため、WebAssemblyをサポートしてないブラウザでも動作可能です。 Blazor WebAssemblyとBlazor Serverの比較 機能 Blazor WebAssembly Blazor Server サーバーリソースへの直接アクセス ❌ ? DBアクセス ❌ ? 初回起動速度 ❌ ? 対応ブラウザ ?Wasm対応ブラウザ ?ほぼすべてのブラウザ オフラインで実行可能 ? ❌ レスポンス速度 ? ? Webサーバー ?静的ファイルをホスティングできれば良い ?ASP.net Coreサーバーが必要 スケーラビリティ ? ?サーバー側リスースの追加が必要 Blazorのメリット .NET、C#の既存の技術でクライアントサイドを実装可能 高機能なVisual StudioのIDE支援や既存のNuGetパッケージなどを、Blazorアプリ開発にそのまま活かせます。Razor構文でそのままクライアント側のビューを実装可能なので、ASP.net MVCの知見を活かすことができます。 クライアントとサーバー間でコードの共有が可能 クライアントサイドもサーバーサイドも.NETで構築するため、コードの共有が可能です。それぞれに重複して処理を実装する必要がないため、効率的に実装することができます。 Blazorが向いている人は誰? Windows FormsやWPFの開発者で、Webアプリの開発を始めようとしている人 Javascriptが分からない、学習したくなかった人でも、既存のC#の知識でクライアントの処理を実装できます。 ※ただし、HTML、CSSの学習は必須。Javascriptがどうしても必要な場面もある ASP.net MVCの開発者で、SPAの開発に興味がある人 本格的なReactやVue.jsなどのフロントエンドフレームワークの学習は敷居が高いと感じている人にもご利用いただけると思います。先程も書きましたが、Razor構文で記述できるため、ASP.net MVCの経験者は既存の技術スタックで対応可能です。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

HDRPのライトを点滅させる

HDRPでも動きます。 Mathfだとうまく動かなったのでRandom.Rangeで using System.Collections; using System.Collections.Generic; using UnityEngine; public class RandomLight : MonoBehaviour { Light myLight; //LIghtクラスのmyLight変数を宣言 public float low = 0.0f; public float high = 0.0f; void Start() { myLight = GetComponent<Light>(); //myLightにオブジェクトのLightコンポーネント情報を代入 } void Update() { myLight.intensity = Random.Range(low,high);  //RandomクラスRangeメソッドで2値間の値を返す //Debug.Log(myLight.intensity); } }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Proccess.Start()で起動するけど うまく動作しないとき

事の発端 それは TwitterのAPIとPythonとTweepyを使って、使いづらいブックマークを自分用に使いやすくしようとしていた時であった。 TwitterのAPIを使う部分はPythonで、収集したデータを表示するのをC#フォームで作っていた。 C#からPythonスクリプトを起動できないかと思って調べていた。 検索して出てきたコードは以下の通り。 var process = new Process() { StartInfo = new ProcessStartInfo("python.exe") { UseShellExecute = false, RedirectStandardOutput = true, Arguments = new string[] { "Test.py" //, //... コマンドライン引数 } } }; サイトによって"Python.exe"の部分が絶対パスであったり、いくつかの細かい部分に違いはあれど、基本的に上記のプログラムが書かれていた。 実際この方法で起動してみたものの、一瞬だけPython.exeのプロンプト(?)が表示され、Pythonスクリプトは作動しなかった。 Pythonのコード自体に文法ミスやエラーとなり得るものは無かった。 その後、StartInfoのWorkingDirectoryを指定したりpython.exeではなくpy.exe(C:\\Windows\\py.exe)を指定して見たりと、試行錯誤をしたものの全て撃沈。 同じ症状がないかと検索してみたものの、ヒットするものは無かった。 うまく"動作"させるには? 実際、1年かな2年かな、いつだか忘れたが以前にも同じような症状に苦しめられた時があった。 たくさんあったゲームをひとまとめにしようと、ランチャーを作ったことがあった。 その時、某(´・ω・`)鬼畜ゲームをProcess.Startで起動した時に、なぜかリソースが読み込まれなかった。 その時に編み出した方法は、コマンドプロンプトを経由させる方法だった。 結局今回もそれに頼ることにした...。 以前の私はStart.batを手動で用意して、それを起動させるように指定したのだが、今回はバッチファイルを生成して、起動、削除まで自動で行うことにした。 この方法はおそらく良くないだろう... 何かほかの解決策があるなら教えてください。 それでは、アプリケーションの階層が次のようだとする。 ? TwitterAPI_App ├─ ? GetTweet.py (Process.Startで起動したいPythonスクリプト) ├─ ? TwitterAPI_Test.exe (アプリケーション) └─ ? TwitterAPI_Test.exe.config この場合は次のようなコードになる。 Form1.cs using System; using System.Diagnostics; using System.IO; using System.Windows.Forms; namespace TwitterAPI_App { public partial class Form1 : Form { private void LaunchPython(object sender, EventArgs e) { // バッチファイルの作成 string curDict = Directory.GetCurrentDirectory(); string batfilePath = Path.Combine(curDict, "Start.bat"); string[] batfileData = new string[2]; batfileData[0] = "@echo off"; // コマンドプロンプトに結果を表示しないだけなので、任意 batfileData[1] = "cmd /c start GetTweet.py"; // "cmd /c"は任意 File.WriteAllLines(batfilePath, batfileData); // プロセスの開始 Process cmd = new Process(); cmd.StartInfo.UseShellExecute = false; cmd.StartInfo.FileName = batfilePath; //cmd.StartInfo.CreateNoWindow = true; // 任意 cmd.Start(); // 終わるのを待ってからファイルを削除 cmd.WaitForExit(); // cmd.Close() // "cmd /c"が無いならおそらく必要 File.Delete(batfilePath); } } } もう1パターンある。 それはアプリケーションの階層が次のような時だ。 ? TwitterAPI_App ├─ ? TwitterAPI │ └─ ? GetTweet.py (Process.Startで起動したいPythonスクリプト) ├─ ? TwitterAPI_Test.exe (アプリケーション) └─ ? TwitterAPI_Test.exe.config この場合はbatファイルの内容が少しだけ変わる。コードは変わる部分のみを書き記す。 Form1.cs namespace TwitterAPI_App { public partial class Form1 : Form { private void LaunchPython(object sender, EventArgs e) { // ... string batfilePath = Path.Combine(curDict, "TwitterAPI", "Start.bat"); string[] batfileData = new string[3]; // フォルダの数だけ増える // string と File.WriteAllText 使う方法もあるけど ここでは省略 batfileData[0] = "@echo off"; batfileData[1] = "cd \"TwitterAPI\""; // 必ずしも\"\"で囲む必要は無いが、フォルダ名に空白があるなら必要 batfileData[2] = "cmd /c start GetTweet.py"; // ... } } } Start.batをどこに生成しようが、"cd \"TwitterAPI\""のくだりは必要となる。 (StartInfo.WorkingDirectoryを指定すれば必要がないかもしれないけど) 以上です。 ちなみにcmd.StartInfo.CreateNoWindow = true;を指定しても、Pythonのウインドウは絶対開くよ。 ('START'になんらかの引数渡せば何とかなるとは思うけど)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む