20190719のC#に関する記事は4件です。

Server Side Blazor + Google 認証 の最小構成メモ

Visual Studio の Server Side Blazor のプロジェクトテンプレートに Google 認証を追加する。

以下の ASP.NET Core Identity なしの Google 認証を行う。

https://docs.microsoft.com/aspnet/core/security/authentication/social/social-without-identity?view=aspnetcore-3.0

環境

  • Visual Studio 2019 16.2.0 Preview 4.0
  • .NET Core SDK 3.0.100-preview6-012264

手順

  • Visual Studio のプロジェクトテンプレートから「ASP.NET Core Web アプリケーション / Blazor サーバーアプリ」を選択し、プロジェクトを生成する。(認証なしで作成)

  • NuGet で以下のパッケージを追加する。

    <PackageReference Include="Microsoft.AspNetCore.Authentication.Google" Version="3.0.0-preview6.19307.2" />

  • Google Developer Console で OAuth のクライアントID等を取得し、appsettings.json か Secret Manager に設定する。
    リダイレクトURLの設定とかもやる。( http://localhost:8080/signin-google とかを追加。※ポート番号確認すること)
    https://docs.microsoft.com/aspnet/core/security/app-secrets

appsettings.json
"Authentication": {
  "Google": {
    "ClientId": "",
    "ClientSecret": ""
  }
}

  • Startup クラスを以下のように変更。

Startup.cs
...
public void ConfigureServices(IServiceCollection services)
{
...
+   services.AddAuthentication(option => {
+       option.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
+       option.DefaultChallengeScheme = GoogleDefaults.AuthenticationScheme;
+   })
+   .AddCookie()
+   .AddGoogle(options => {
+       var google = this.Configuration.GetSection("Authentication:Google");
+           options.ClientId = google["ClientId"];
+           options.ClientSecret = google["ClientSecret"];
+   });

+   services.AddControllers();

    services.AddRazorPages();
    services.AddServerSideBlazor();
...
}
...
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
...
    app.UseRouting();

+   app.UseAuthentication();
+   app.UseAuthorization();

    app.UseEndpoints(endpoints => {
        endpoints.MapBlazorHub();
+       endpoints.MapDefaultControllerRoute();
        endpoints.MapFallbackToPage("/_Host");
    });
...
}

  • 以下の Shared/LoginDisplay.razor を作成する。

Shared/LoginDisplay.razor
<AuthorizeView>
    <Authorized>
        <text>Hello, @context.User.Identity.Name!</text>
        <a href="Account/Logout">Log out</a>
    </Authorized>
    <NotAuthorized>
        <a href="Account/Login">Log in</a>
    </NotAuthorized>
</AuthorizeView>

  • MainLayout.razor を以下のように変更

Shared/MainLayout.razor
...
<div class="main">
    <div class="top-row px-4">
+       <LoginDisplay />
        <a href="https://docs.microsoft.com/en-us/aspnet/" target="_blank">About</a>
    </div>
...

  • Controllers/AccountController.cs を作成し以下の AccountController クラスを作る。

Controllers/AccountController.cs
public class AccountController: Controller
{
    public IActionResult Login()
    {
        return this.Challenge(new AuthenticationProperties {
            RedirectUri = "/"
        });
    }

    public IActionResult Logout()
    {
        return this.SignOut(new AuthenticationProperties {
            RedirectUri = "/"
    });
}

  • FetchData.razor 等のページに @attribute [Authorize] を付ける。

おわり。

※ これはとりあえず動くようにしただけなので Cookie の設定とかいろいろ後でちゃんとやること。リダイレクト周りとか。オープンリダイレクト注意。
https://docs.microsoft.com/aspnet/core/security/preventing-open-redirects

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

[Blazor]Blazor事始め(.NET Core 3.0 Preview 6)

Visual studio 2019を使ってBlazorのテンプレートを作成から実行までをやってみたいと思います。C#なコードがブラウザでそのまんま動いちゃうってシビれますよね。

ゴール

  • ゼロ環境からBlazorテンプレートをビルドして実行できるようになる

環境

  • .NET Core 3.0.100-preview6-012264
  • Visual Studio 2019 (Version 16.2.0 Preview 4.0)
  • Blazor extension
  • Windows 10 1903

手順

preview3の頃は若干プロジェクトの作成が面倒くさかったのですが、preview6ではだいぶ改善されています。

.NET Core SDKのインストール

最新版のSDK(記事作成時点ではSDK 3.0.100-preview6-012264)をMicrosoftのサイトよりダウンロードし、インストールします。
https://dotnet.microsoft.com/download/dotnet-core/3.0
001_dotnet3.0_sdk_download.png

ダウンロードしたexeを実行して、インストールをクリック。
002_dotnet3.0_install.png

しばしプログレスバーと戯れて...
003_dotnet3.0_installing.png

何事もなければ数分でインストールが終了する。
004_dotnet3.0_install_success.png

ちゃんとインストールされているか以下で確認をする。

> dotnet --version
3.0.100-preview6-012264

テンプレートの取得

続いて、Blazorプロジェクトのテンプレートを取得します。

> dotnet new -i Microsoft.AspNetCore.Blazor.Templates::3.0.0-preview6.19307.2

テンプレートがインストールされたか確認します。Blazorのテンプレート一覧がでていれば問題ありません。

> dotnet new --list | findstr Blazor
Blazor (server-side)                              blazorserverside      [C#]              Web/Blazor                    
Blazor (ASP.NET Core hosted)                      blazorhosted          [C#]              Web/Blazor/Hosted             
Blazor Library                                    blazorlib             [C#]              Web/Blazor/Library            
Blazor (Server-side in ASP.NET Core)              blazorserverside      [C#]              Web/Blazor/ServerSide         
Blazor (client-side)                              blazor                [C#]              Web/Blazor/Standalone 

Visual Studio 2019 Preview版のインストール

プレビュー版をインストールするため、次のURLからexeをダウンロードします。
https://visualstudio.com/vs/preview

ダウンロードしたexeを実行します。
005_vs2019_preinstall.png

ASP.NET と Web 開発にチェックを入れ、インストール処理を進めます。
006_vs2019_install_options.png

ダウンロードサイズが大きい為、少々時間がかかります。プログレスバーと戯れましょう。
007_vs2019_installing.png

Blazor extensionのインストール

引き続き、Blazor extensionをインストールします。
下記URLのDownloadをクリックしvsixをダウンロードします。
https://marketplace.visualstudio.com/items?itemName=aspnet.blazor

ダウンロードしたvsixを実行し、再びプログレスバーと戯れます。
008_blazor_install.png

ここまで終了したら下準備は終了です。

プロジェクトの作成

Visual Studioを立ち上げ、新しいプロジェクトの作成をクリックします。
プロジェクトテンプレートはASP.NET Core Web アプリケーションを選択します。
009_create_project.png

プロジェクトの構成は任意の名前にしてください。なんでもOKです。
010_create_project.png

テンプレートは.Net Core ASP.NET Core 3.0Blazor WebAsembly アプリを選択します。ちなみに2つありますが、下を選んで作成をクリックしてください。
011_create_project.png

ビルド&実行

テンプレートの読み込みが終了し、Visual Studioが起動したらデバック実行します。
webブラウザーはChromeを選択しておきましょう。(IEは非対応)
012_debug_f5.png

ビルドに失敗しなければ、Chromeが立ち上がりMSにしてはいい感じの画面が表示されます。
013_first_view.png

ちゃんとWebAssemblyらしくDLLが読み込まれてブラウザで実行されています。
014_dl_dll.png

以上、終了です。
後はテンプレートを煮るなり焼くなりしてゴリゴリコーディングしましょう。

注意事項

  • IEはWebAssemblyに未対応のため、Loading...の画面から遷移しない
  • 自分の環境ではなぜかテンプレートにBlazor WebAssembly アプリが2つ表示された
    • ちなみに双方違う内容のプロジェクトを作成する
    • 名前も説明文も一緒のため紛らわしい(下が正解だった)
  • まだプレビュー版のため、今後手順が変更になる可能性がある

参考文献

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

テトリスの次にレーシングゲーム作った話

はじめに

こんにちは。ユニバの MJ です。
前回はテトリスを二週間で作った後に、なんと部活動っぽくなりまして、ユニバユニティ倶楽部 略して UUC という糞ダサネームで活動していくことになりました。
そうして今回はレーシングゲームを作ろうかという話になって、大体できたので記事にしようかと思った次第です。
今回のゲームは Maker Faire Tokyo 2019 でプレイできる予定なので、いらっしゃる方がいたら弊社ブースに足を運んでいただければ幸いです。

できたもの

今回はシャワーヘッドが爆走するレーシングゲームを作ることになった。
製作期間は大体一か月ぐらい?
案件が入ったりでやっぱり大変だった。
きっかけはメンバの一人がシャワーヘッドを握っていたことに由来。

shawer-op.gif

op。 意味ありげなシーン。特に意味はない。

shawer-select.gif

機体セレクト。なるべく高級感を出したかった。普通に店頭販売用のプロモーションにこういうの使ったら面白そう(仕事ください)

shawer-race (1).gif

レースシーン。シャワーの飛沫が画面にかかるようになっている。非常に不快。
と単純なレーシングゲームではありますが、テトリスの何倍も考えることが多く大変でした。
参加メンバーの皆さんお疲れさまでした。

開発メンバ

MJ(おじさん1): 主にロジック担当、今回は画面のざっとした絵作りとかしてみたり、とにかく前に進めることを考える
おじさん2;AI書いたり、周回判定したり
おじさん3:UI置いてくれたり画面つなぎこんでくれたり
おじさん4:音つくってくれたり、フォント選定してくれたり
わかさ1:エフェクトつくってくれたり
わかさ2:ステージつくってくれたり、もろもろ指導してくれたり
わかさ3:シーンロード系の基盤を用意してくれたり

みたいな感じ。ウェブ開発より登場人物多いかも!

プロジェクト管理

前回はかなりざっくりとした管理だったので、今回はちょっと力をいれました。
とはいえ、今回もやる気ベースで無理をしない。

仕様をざっくり共有する

何はともあれみんなで作るもののイメージを含ませるのは大事
基本的な仕様だったり、どんな質感にするのかだったり、使わないものでもとりあえずまとめたりする。
Miro という最高便利ツールを使ってまとめてます。

siyou1.PNG

全体のざっくり仕様まとめ、取り組む課題や今回は妥協するとこなど、自分の取り組む課題の下地に利用する

siyou2.png

世界観。実現無理そうなものでもワイワイ話せるのが良い

siyou3.png

シーンフロー。予想がたったら、ユニティの世界でどうするか一旦考えたりする。現実味を帯びてきた。

siyou4.png

実際こんな感じかな?とうい図。絵が上手いとか下手とかではなく、こういうイメージを持ってますという宣言が大事。

スプレッドシートで最初にスケジュール構想を練りながら毎週何をする予定かを書いたりする

schedule.PNG

スケジュールシート。時期に対する着地点と、それに対して毎週何をする予定かをまとめる。
他の案件との兼ね合いもあるので無理せず、ゴールをアップデートしながら進めた。

というのをしながら進めました。前回よりプロジェクトっぽい装いですね。

今後に向けてと反省

繋がないと盛り上がらない

ユニティ開発というものはある種コンフリクトとの闘いでもあるなと感じていて、いかにお互いが気持ちよくシーンを開発するか?というテーマのもデバッグシーンを一人一個もった状態で開発をつづけました。が、徐々にモチベーションが下がっていく。一人一人の進捗は確実にあるのに。
要するに作業はしてるんだけど、ゲームが出来てないというジレンマが皆の中にあったわけですね。
スケジュールにあった目標は達成はしているんですが、マスタシーンの上で動いていたわけではなかったのです。

なので次回はマスタシーンにつなぐ時期とか、完成度 xx% でも一旦入れましょう。
とかそういうところを考えないといけないですね。

絵を描くってすごい大事

弊社は基本的に web を主に生業にしている会社なのですが、ウェブサイトというのはある程度フレームが決まっているものです(慣れているだけかもしれないですが、、、)。それに比べてゲームというのは無限の可能性を秘めいているわけで、とにかくシーンの装いの第一歩を決めたり、こういう演出をしたいんだ!と宣言するのが大事ですね。

進行に関して言えば最初はスタートダッシュを切ることはできましたが、そのあとも継続的に妄想を続ける必要があったかな?と思います。

ちなみに私が途中で書いたのがこれ。

File.png
エフェクトの感じ。同じような感じにはいかなかったが、勢いは共有できた。

File (1).png
セレクトシーン。おしゃれな感じにはなったなという印象。

File (2).png
op シーンの元ネタ。常夏な雰囲気がよかったけど、アンニュイな感じに実際はなった。

実際作りながら書くというの大変なんですが、やっぱり俯瞰してみたり、勢いを感じれたり、そういうのがゲームという総合作品に関してはより重要になりますね。

最後に

弊社はユニティを使って表現を行い、さらには現実世界とのつながり(ハードウェア)もデザインすることができます。 Maker Faire Tokyo 2019 ではシャワーヘッド型コントローラで試遊してもらう想定です。

IMG_0057.jpg

せっかくなのでユニティ案件あると楽しいなと思っているので気軽にお声がけください。
露骨な宣伝になってしまいましたが、ゲーム作りやると凄いノウハウ溜まって楽しいよ!というお話でした。
みんなも作ったもの自慢しよう。

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

【Unity】Unity Editorかスマホ実機か判別して処理を分ける

はじめに

スマホ実機で毎回動作確認するのが面倒だったので、Unity Editorの場合はキーボード操作ができるようにしました。

サンプルスクリプト

Main CameraにAttachして使用することを想定したスクリプトです。
Unity Editorの場合は、方向キーで視点移動ができるように、
スマホ実機(Unity Editor以外)の場合は、端末を傾けて視点移動ができるようになっています。

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

public class GyroController : MonoBehaviour
{
    // キーボード操作用
    private Vector3 rotate;
    void Start()
    {
        // Unityエディタと実機で処理を分ける
        if (Application.isEditor)
        {
            rotate = transform.rotation.eulerAngles;
        }
        else 
        {
            Input.gyro.enabled =true;
        }
    }

    void Update()
    {
        // キーボードで視点変更
        float speed = Time.deltaTime * 100.0f;

        // PCは矢印キーで視点変更
        if (Application.isEditor)
        {
            if (Input.GetKey(KeyCode.LeftArrow))
            {
                rotate.y -= speed;
            }
            if (Input.GetKey(KeyCode.RightArrow))
            {
                rotate.y += speed;
            }
            if (Input.GetKey(KeyCode.UpArrow))
            {
                rotate.x -= speed;
            }
            if (Input.GetKey(KeyCode.DownArrow))
            {
                rotate.x += speed;
            }
            transform.rotation = Quaternion.Euler(rotate);
        }
        // スマホはジャイロで視点変更
        else
        {
            Quaternion gratitude = Input.gyro.attitude;
            gratitude.x *= -1;
            gratitude.y *= -1;
            transform.localRotation = Quaternion.Euler(90, 0, 0) * gratitude;
        }
    }
}

最後に

Unity初心者なので、より良い方法や間違いがあったら、是非教えてほしいです。

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