20190502のC#に関する記事は6件です。

2019年 EntityFramework を使って .netcore webapp のDBを作る

概要

.netcore WebApp を使ったWebサービスのテンプレート作りの一環です。

コードファーストでEntityFramework を使って一からDBをつくる箇所をやる機会がなかったので
チュートリアルを実行しました。

環境

Windows10 Pro 1809
Visual studio 2019
.NETCore 2.1

参考文献:
https://docs.microsoft.com/ja-jp/ef/core/get-started/aspnetcore/new-db?toc=%2Faspnet%2Fcore%2Ftoc.json&bc=%2Faspnet%2Fcore%2Fbreadcrumb%2Ftoc.json&view=aspnetcore-2.2&tabs=visual-studio

Microsoftの公式チュートリアルを利用します。
Visual Studio 2017 を利用となってますが Visual Studio 2019でも問題ありませんでした。

> Visual Studio 2017 を開きます 
> [ファイル] > [新規] > [プロジェクト]
> 左側のメニューから [インストール済み] > [Visual C#] > [.NET Core] の順に 選択します。
> [ASP.NET Core Web アプリケーション] を選択します。
> 名前に「EFGetStarted.AspNetCore.NewDb」を入力して [OK] をクリックします。
>[新しい ASP.NET Core Web アプリケーション] ダイアログで次の手順を実行します。

DBに作る項目は、Model Class を作成します。
Visual Studio では Modelをフォルダを作成(MVCモデルではすでに作成済み)してそのなかに入れます。

Models フォルダーを右クリックし、[追加] > [クラス] の順に選択します。
名前に「Model.cs」を入力して [OK] をクリックします。
このファイルの内容を次のコードに置き換えます。
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;

namespace EFGetStarted.AspNetCore.NewDb.Models
{
    public class BloggingContext : DbContext
    {
        public BloggingContext(DbContextOptions<BloggingContext> options)
            : base(options)
        { }

        public DbSet<Blog> Blogs { get; set; }
        public DbSet<Post> Posts { get; set; }
    }

    public class Blog
    {
        public int BlogId { get; set; }
        public string Url { get; set; }

        public ICollection<Post> Posts { get; set; }
    }

    public class Post
    {
        public int PostId { get; set; }
        public string Title { get; set; }
        public string Content { get; set; }

        public int BlogId { get; set; }
        public Blog Blog { get; set; }
    }
}

ASP.NER Core でDBのモデルを使えるようにするにはDI(Dependency injection )が必要です。
Startup.csから設定がいります。

using EFGetStarted.AspNetCore.NewDb.Models;
using Microsoft.EntityFrameworkCore;

次の強調表示されたコードが ConfigureServices メソッドに追加されます。

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        // This lambda determines whether user consent for non-essential cookies is needed for a given request.
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

    //ここ
    var connection = @"Server=(localdb)\mssqllocaldb;Database=EFGetStarted.AspNetCore.NewDb;Trusted_Connection=True;ConnectRetryCount=0";
    services.AddDbContext<BloggingContext>
        (options => options.UseSqlServer(connection));

    // BloggingContext requires
    // using EFGetStarted.AspNetCore.NewDb.Models;
    // UseSqlServer requires
    // using Microsoft.EntityFrameworkCore;
}

EntityFramework の CodeFirstで作った場合
Visual Studio のパッケージマネージャーコンソールで DBの反映をします

Add-Migration InitialCreate

参照:https://docs.microsoft.com/ja-jp/ef/core/managing-schemas/migrations/
これで、DBを作成するファイルが作成されます。

XXXXXXXXXXXXXX_InitialCreate.cs--メインの移行ファイル。 (Up() で) 移行を適用し、(Down() で) それを元に戻すために必要な操作が含まれます。
XXXXXXXXXXXXXX_InitialCreate.Designer.cs--移行メタデータ ファイル。 EF によって使用される情報が含まれます。
MyContextModelSnapshot.cs--現在のモデルのスナップショット。 次の移行を追加するときの変更内容の決定に使用されます。

続いて 次のコマンドを パッケージマネージャーコンソールに実行することで
databeseがUpdateされます。

Update-Database

実際にDBが作られたかどうかは
SQL Server Management Studio (SSMS) を使うと便利です。
https://docs.microsoft.com/ja-jp/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-2017

image.png

Qiita 記事だと
https://qiita.com/Nossa/items/d48fbe91ca470748a3d7
参考になります。

今回作ったサンプルをGithubに上げました。
https://github.com/yamuun/EFGetStarted.AspNetCore.NewDb

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

[C#]テキスト/CSV/Excelのファイルを読み取る簡単な方法

はじめに

この記事は新人プログラマーもしくは基本的な文法は一通り勉強した方が、C#でテキスト/CSV/Excelファイル、拡張子で言えば.txt/.csv/.xlsxのファイルを読み取りたいときに参考になればと思って書きました。

・Windows/Visual Studioの環境でコンソールアプリケーションもしくはフォームアプリケーション(デスクトップアプリケーション)開発を想定しています。
・フレームワークは.NET Framework 4.7.2
・とにかく難しいことは置いといてファイル読み取ってとりあえず読み取った値を出力したい方向けです。

テキストファイル(.txt)を読み取る

まずは読み取りたいテキストファイル(textfile.txt)をデスクトップに作っておきます。
中身は、カンマで区切って2文を書いてます。
1.png

C#でテキストファイルを読み込む場合は、StreamReaderクラスを使用します。
今回は、テキストファイルを読み込んでコンソール画面に出力します。

txtサンプルコード

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace Read_txt
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                //読み込むtxtファイルのパスを指定して開く
                using (StreamReader sr = new StreamReader(@"C:\Users\hiroki\Desktop\textfile.txt"))
                {
                    //末尾まで繰り返す
                    while (!sr.EndOfStream)
                    {
                        //1行づつ読み取る。
                        string line = sr.ReadLine();
             //コンソールに出力する
                        Console.WriteLine(line);
                    }
                }
            }
            catch (System.Exception e)
            {
                Console.WriteLine(e.Message);
            }

        }
    }
}


出力結果
2.png

  • StreamReaderクラスを使用するためコードの冒頭にusing System.IO;の名前空間を宣言しておきます。
  • StreamReaderを使用する際は何のファイルがどこにあるか(パス)を指定する必要があります。 パスの探し方はテキストファイルのプロパティに書いてあります。プロパティの場所の後に¥を入れテキストファイルの名前と拡張子を入れてください。

3.png

  • try~catch構文を使いtry{}でファイルがうまく読み取れなかったときに、catch{}でエラーを出力するようにしています。
  • using(StreamReaderクラス)でファイルを開いた後は必ず閉じるようにしています。開いたファイルを閉じるようにしないとバックグラウンドで開いた状態になる可能性があります。
  • 他のメソッドはこちらが詳しいです。

CSVファイルを読み取る

CSVファイルもStreamReaderクラスを使用します。
エクセルでA1辺りのセルに適当に文字を書いてください。このときセルにカンマは必要ありません。名前を付けて保存する際に拡張子をCSVに指定してください。

CSVファイルを読み込みコンソールに出力するコードです。

CSVサンプルコード

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace Read_CSV
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                //読み込むcsvファイルのパスを指定して開く
                using (StreamReader sr = new StreamReader(@"ファイルのパス"))
                {
                    while (!sr.EndOfStream)
                    {
                        //1行づつ読み取る。カンマも読み取っている。
                        string line = sr.ReadLine();
                        //カンマで区切った文の塊を格納する
                        string[] values = line.Split(',');

                        foreach (var list in values)
                        {
                            Console.WriteLine("{0}", list);
                        }
                    }
                }
            }
            catch (System.Exception e)
            {
                Console.WriteLine(e.Message);
            }  
        }
    }
}

  • CSVとはカンマごとに区切られた文字や値の塊です。したがって、string[] values = line.Split(',');ではカンマごとに塊を配列に格納します。文字として読み取るのでstring型になっています。
  • 配列として塊があるので全配列を扱うforeach構文を使いコンソールに出力します。

エクセルファイル(.xlsx)を読み取る

最後にエクセルファイルの読み込みです。エクセルファイルを読み込むにはいくつかの方法がありますが、初心者が扱うには手に負えない複雑なものもあります。ここでは私が最も簡単だと思うサードパーティが提供しているClosedXMLというライブラリを使います。

ClosedXMLというライブラリを使うための準備などをこちらを参考にしてください。

エクセルファイルをデスクトップに用意しそのセル情報を読み込んだコードです。
A1とA2に文字を記入しています。

エクセルサンプルコード

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ClosedXML.Excel;

namespace Read_xlsx
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                //読み込むxlsxのファイルパスを指定して開く
                using (var workbook = new XLWorkbook(@"エクセルファイルのパス名"))
                {
                    //ワークシートを取得する
                    var worksheet = workbook.Worksheet("シート名");
                    //位置を指定してセルを取得する
                    var cellA1 = worksheet.Cell("A1");//A1のセルを取得する
                    var cellA2 = worksheet.Cell(2, 1);//2行目の1列のセルを取得する
                    Console.WriteLine(cellA1.Value);
                    Console.WriteLine(cellA2.Value);
                }

            }
            catch (System.Exception e)
            {
                Console.WriteLine(e.Message);
            }

        }
    }
}

  • コードの冒頭でusing ClosedXML.Excel;を宣言してください。他の方の昔の記事でusing ClosedXML;だけの宣言で終わってますが、エラーが出ますので注意してください。
  • xlsxのファイルのクラスを宣言し、ワークシートを指定します。
  • ファイルのパス名はエクセルファイルのプロパティからコピペしてください。
  • 今回は指定したワークシートのセルA1とA2だけに文字が格納されているとしてコンソールに出力しています。

最後に

テキストとCSVファイルを読み取るStreamReaderクラスやその他のメソッドは主に独習C#を参考にしました。
エクセルの読み取りは他の記事をググって参考にしました。あまり体系的に書かれているものがなかったので今回まとめてみました。

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

[C#]テキスト/CSV/Excelのファイルを読み取る方法

はじめに

この記事は新人プログラマーもしくは基本的な文法を一通り勉強した方が、C#でテキスト/CSV/Excelファイル、拡張子で言えば.txt/.csv/.xlsxのファイルを読み取りたいときに参考になればと思って書きました。
私自身もC#を勉強中ですので切磋琢磨できればと思います。

・Windows/Visual Studioの環境でコンソールアプリケーションもしくはフォームアプリケーション(デスクトップアプリケーション)開発を想定しています。
・フレームワークは.NET Framework 4.7.2
・とにかく難しいことは置いといてファイル読み取ってとりあえず読み取った値を出力したい方向けです。

テキストファイル(.txt)を読み取る

まずは読み取りたいテキストファイル(textfile.txt)をデスクトップに作っておきます。
中身は、カンマで区切って2文を書いてます。
1.png

C#でテキストファイルを読み込む場合は、StreamReaderクラスを使用します。
今回は、テキストファイルを読み込んでコンソール画面に出力します。

txtサンプルコード

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace Read_txt
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                //読み込むtxtファイルのパスを指定して開く
                using (StreamReader sr = new StreamReader(@"C:\Users\hiroki\Desktop\textfile.txt"))
                {
                    //末尾まで繰り返す
                    while (!sr.EndOfStream)
                    {
                        //1行づつ読み取る。
                        string line = sr.ReadLine();
             //コンソールに出力する
                        Console.WriteLine(line);
                    }
                }
            }
            catch (System.Exception e)
            {
                Console.WriteLine(e.Message);
            }

        }
    }
}


出力結果
2.png

  • StreamReaderクラスを使用するためコードの冒頭にusing System.IO;の名前空間を宣言しておきます。
  • StreamReaderを使用する際は何のファイルがどこにあるか(パス)を指定する必要があります。 パスの探し方はテキストファイルのプロパティに書いてあります。プロパティの場所の後に¥を入れテキストファイルの名前と拡張子を入れてください。

3.png

  • try~catch構文を使いtry{}でファイルがうまく読み取れなかったときに、catch{}でエラーを出力するようにしています。
  • using(StreamReaderクラス)でファイルを開いた後は必ず閉じるようにしています。開いたファイルを閉じるようにしないとバックグラウンドで開いた状態になる可能性があります。
  • 他のメソッドはこちらが詳しいです。

CSVファイルを読み取る

CSVファイルもStreamReaderクラスを使用します。
エクセルでA1辺りのセルに適当に文字を書いてください。このときセルにカンマは必要ありません。名前を付けて保存する際に拡張子をCSVに指定してください。

CSVファイルを読み込みコンソールに出力するコードです。

CSVサンプルコード

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace Read_CSV
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                //読み込むcsvファイルのパスを指定して開く
                using (StreamReader sr = new StreamReader(@"ファイルのパス"))
                {
                    while (!sr.EndOfStream)
                    {
                        //1行づつ読み取る。カンマも読み取っている。
                        string line = sr.ReadLine();
                        //カンマで区切った文の塊を格納する
                        string[] values = line.Split(',');

                        foreach (var list in values)
                        {
                            Console.WriteLine("{0}", list);
                        }
                    }
                }
            }
            catch (System.Exception e)
            {
                Console.WriteLine(e.Message);
            }  
        }
    }
}

  • CSVとはカンマごとに区切られた文字や値の塊です。したがって、string[] values = line.Split(',');ではカンマごとに塊を配列に格納します。文字として読み取るのでstring型になっています。
  • 配列として塊があるので全配列を扱うforeach構文を使いコンソールに出力します。

エクセルファイル(.xlsx)を読み取る

最後にエクセルファイルの読み込みです。エクセルファイルを読み込むにはいくつかの方法がありますが、初心者が扱うには手に負えない複雑なものもあります。ここでは私が最も簡単だと思うサードパーティが提供しているClosedXMLというライブラリを使います。

ClosedXMLというライブラリを使うための準備などをこちらを参考にしてください。

エクセルファイルをデスクトップに用意しそのセル情報を読み込んだコードです。
A1とA2に文字を記入しています。

エクセルサンプルコード

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ClosedXML.Excel;

namespace Read_xlsx
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                //読み込むxlsxのファイルパスを指定して開く
                using (var workbook = new XLWorkbook(@"エクセルファイルのパス名"))
                {
                    //ワークシートを取得する
                    var worksheet = workbook.Worksheet("シート名");
                    //位置を指定してセルを取得する
                    var cellA1 = worksheet.Cell("A1");//A1のセルを取得する
                    var cellA2 = worksheet.Cell(2, 1);//2行目の1列のセルを取得する
                    Console.WriteLine(cellA1.Value);
                    Console.WriteLine(cellA2.Value);
                }

            }
            catch (System.Exception e)
            {
                Console.WriteLine(e.Message);
            }

        }
    }
}

  • コードの冒頭でusing ClosedXML.Excel;を宣言してください。他の方の昔の記事でusing ClosedXML;だけの宣言で終わってますが、エラーが出ますので注意してください。
  • xlsxのファイルのクラスを宣言し、ワークシートを指定します。
  • ファイルのパス名はエクセルファイルのプロパティからコピペしてください。
  • 今回は指定したワークシートのセルA1とA2だけに文字が格納されているとしてコンソールに出力しています。

最後に

テキストとCSVファイルを読み取るStreamReaderクラスやその他のメソッドは主に独習C#を参考にしました。
エクセルの読み取りは他の記事をググって参考にしました。あまり体系的に書かれているものがなかったので今回まとめてみました。

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

WPF/C# で表示中の画像を A4 用紙いっぱいに印刷する

WPF/C# でアプリケーション内に表示している画像を A4 用紙いっぱいに配置して印刷する方法です。
印刷方法については、こちらの記事 を参考にさせていただいてます。

事前準備

WPF アプリケーションのプロジェクトに「System.Printing」と「ReachFramework」の参照を追加します。

表示中の画像の印刷

WPF アプリケーションで System.Windows.Controls.Image クラスを使って画像を表示している場合、この ImageSource プロパティを渡すだけで表示中の画像が印刷されます。Viewbox を使っているので A4 用紙いっぱいに配置されます。

public static void PrintImage(ImageSource imageSource)
{
    using (var server = new LocalPrintServer())
    {
        // A4 縦の用紙を準備
        var queue = server.DefaultPrintQueue;
        var ticket = queue.DefaultPrintTicket;
        ticket.PageMediaSize = new PageMediaSize(PageMediaSizeName.ISOA4);
        ticket.PageOrientation = PageOrientation.Portrait;

        // 印刷可能領域を取得
        var area = queue.GetPrintCapabilities().PageImageableArea;
        if (area == null) throw new Exception("印刷可能領域の取得に失敗 ...");

        // 用紙いっぱいにイメージを配置
        var page = new FixedPage();
        var viewBox = new Viewbox
        {
            Child = new Image { Source = imageSource },
            Margin = new Thickness(area.OriginWidth, area.OriginHeight, 0, 0),
            Width = area.ExtentWidth,
            Height = area.ExtentHeight,
            VerticalAlignment = VerticalAlignment.Top
        };
        page.Children.Add(viewBox);

        // デフォルトプリンタで印刷
        PrintQueue.CreateXpsDocumentWriter(queue).Write(page, ticket);
    }
}

こんな感じに。
印刷イメージ
ここでは仮想プリンタに出力して PDF で保存したんですが、実際のプリンタを「通常使うプリンターに設定」しておけば、このメソッドを呼ぶだけで直接、印刷されます。

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

UnityのスマホネイティブプラグインをKotlin/Nativeで共通化する

Unityのスマホネイティブプラグインを言語統一できないか?

昨今のスマホネイティブプラグインの言語の選択肢としてはJava, Kotlin, Objective-c, Swiftがあげられるかと思います。
たまに自分も趣味などでプラグインを使うことがあるのですが同じような処理を別で書かないといけないのが手間だと思っていました。
そこで昨年くらいからスマホのネイティブ界隈で話題になっていたKotlin/Nativeに目をつけてUnityで実行させてみたという記事です。

そもそもKotlin/Nativeとは…?
まとめている記事もありましたので参照させて頂きます。

基本的にはスマホネイティブの共通化できるロジックをKotlinで書いて共通化させようぜ!ってことなのですがAndroidでは.jarとしても吐き出せますし、iOSは.frameworkとして吐き出せるのでネイティブにとって扱いやすいものになっています。

さて、今回検証に使用したリポジトリです。動かして見たい人は是非ご活用ください。

実行した結果

Android iOS
Screenshot_20190502-040341.jpg Simulator Screen Shot - iPhone Xʀ - 2019-05-02 at 10.31.23.png

文字列をOS毎に変えるという処理ですが呼び出すメソッドは1つにしてあります。

準備

Kotlin/Native自体の作成方法は既にわかりやすい記事がありますのでそちらを参照させていただきます。
Kotlin/Nativeチュートリアル Android, iOS編
自分はここを参考にさせて頂きました。そのため今回上記の記事をベースに進めます。

Androidのネイティブが自分はよくわからなかったので、最初は基本的にコピペで作って必要な箇所を変えていきました。

今回、上記記事の「Common moduleの解説」の章まで出来たら一旦は大丈夫です。
上記の記事ほぼそのままですがソースコードを載せておきます。

共通

common.kt
package com.sample.mizotake.kotlinnativeforunity

expect fun platformName(): String

public class common {
    public fun createApplicationScreenMessage(): String {
        return "Call Kotlin Native on ${platformName()}"
    }
}

Android

actual.kt
package com.sample.mizotake.kotlinnativeforunity

actual fun platformName(): String {
    return "Android"
}

iOS

actual.kt
package com.sample.mizotake.kotlinnativeforunity

import platform.UIKit.UIDevice

actual fun platformName(): String {
    return UIDevice.currentDevice.systemName() +
            " " +
            UIDevice.currentDevice.systemVersion
}

共通処理にUnityで呼び出すクラスとメソッドを定義します。OS毎に変える処理はexpect actual処理でinterfaceのように切り出して呼べるようです。

Unityへの導入

Android

自分もよく把握できていませんがGradle Syncをするとbuildというディレクトリができて
スクリーンショット 2019-05-02 11.06.40.png

プロジェクト名 + android.jarができていました。
もし出来ていない場合は
スクリーンショット 2019-05-02 11.04.44.png
右端にGradleというタブがあるのでそこからbuildの項目を見るとbuildの詳細一覧があるのでandroidJarをダブルクリックすれば走り出してjarができるかと思います。

吐き出されたjarをUnityのPlugin/Androidに放り入れるだけです。
これでUnityへの導入は完了です。

iOS

こちらは先ほどのKotlin/Nativeチュートリアル Android, iOS編の「iOSアプリ」の章にあるbuild.gradleの追記だけ行いましょう。

/common/build.gradle
...

task packForXCode(type: Sync) {
    final File frameworkDir = new File(buildDir, "xcode-frameworks")
    final String mode = project.findProperty("XCODE_CONFIGURATION")?.toUpperCase() ?: 'DEBUG'

    inputs.property "mode", mode
    dependsOn kotlin.targets.iOS.compilations.main.linkTaskName("FRAMEWORK", mode)

    from { kotlin.targets.iOS.compilations.main.getBinary("FRAMEWORK", mode).parentFile }
    into frameworkDir

    doLast {
        new File(frameworkDir, 'gradlew').with {
            text = "#!/bin/bash\nexport 'JAVA_HOME=${System.getProperty("java.home")}'\ncd '${rootProject.rootDir}'\n./gradlew \$@\n"
            setExecutable(true)
        }
    }
}

tasks.build.dependsOn packForXCode

ここの部分ですね。これを追記して./gradlew buildすることで
スクリーンショット 2019-05-02 11.17.06.png
main.frameworkができます。これをUnityのPlugin/iOSに放り込めばframeworkの導入は大丈夫ですが、iOSの場合もう一手間必要です。
externの実装がないとC#では呼び出せませんそのためPlugin/iOSフォルダに

common.mm
#import <main/main.h>

extern "C" {
    const char* createApplicationScreenMessage() {
        NSString *message = [[Maincommon alloc] init].createApplicationScreenMessage;
        return strdup([message UTF8String]);
    }
}

を追加しましょう。これを追加することで先ほど作ったKotlinで書いたコードのframeworkを参照できます。
ここでcommonというkotlinファイルを作ったがMaincommonって何だろう?ってなると思います。どうやらframeworkに吐き出す時に変換されているようです。
それを確認するにはAndroidStudioでframeworkのHeaderを見ると一番下の行に自分で実装した処理が追記されていると思います。
スクリーンショット 2019-05-02 11.22.16.png

これを参考にしてObjective-c++でインターフェースを定義する必要があります。
ちなみにSwiftだとMaincommonという変換名ではなくcommonで呼び出せそうですがSwiftを使うために手間をかけるよりObjective-c++を書いた方が早いと自分は思うのでこのまま進めます。

C#で呼び出す

事前準備は終わりました。
UnityではuGUIのTextにネイティブで呼び出した文字列を表示させます。

CallKotlinNative.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.Runtime.InteropServices;

public class CallKotlinNative : MonoBehaviour
{

#if UNITY_IOS
    [DllImport("__Internal")]
    private static extern string createApplicationScreenMessage();
#endif

    private Text viewableText;

    void Start()
    {
        var pluginMessage = "";
#if UNITY_ANDROID
        using (var plugin = new AndroidJavaObject("com.sample.mizotake.kotlinnativeforunity.common"))
        {
            pluginMessage = plugin.Call<string>("createApplicationScreenMessage");
            Debug.Log(pluginMessage);
        }
#elif UNITY_IOS
        pluginMessage = createApplicationScreenMessage();
#endif
        viewableText = GetComponent<Text>();
        viewableText.text = pluginMessage;
    }
}

C#側は普通にネイティブプラグインを呼び出すだけですね。
これを実機ビルドまたはシミュレータービルドすることで動作の確認ができると思います。

終わりに

Kotlin/NativeのUnityProjectへの導入は手間が必要かと思っていましたが思った以上に簡単でした。ただ、iOSの導入のexternだけどうにかならなかいとAndroidProject内に.mm入れてみて.frameworkだけ吐き出して更新させるなどをしようと思いましたがうまく行きませんでした…Androidネイティブのディレクトリ構成やtaskのカスタムに詳しければどうにかできるのかな?と思っています。
Kotlin/Nativeを使えば基本的に言語はKotlinひとつに統一できますし、共通処理やOS依存処理も問題ないのではない気がしています。個人的にKotlinでUIKitなどもimportして使えることに驚きました。
何にせよ扱う言語は少ないに限ると思っていますのでKotlin/Nativeは良いものだと思います。ただ現在betaなので書き方や吐き出し方が変わる可能性は高いです。

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

UnityでのVSCodeの導入手順とおすすめ設定、拡張機能(Mac)

はじめに

Unityを使う際、デフォルトではスクリプトエディタとしてVisual Studioが設定されていますが、「VSCode便利だよ」と先輩エンジニアの方に勧めて頂いたので導入してみました。結果、色々カスタマイズできて便利だったので、備忘録として導入手順とおすすめ設定をまとめてみました。

VSCodeのインストール

下のリンクからダウンロードし、インストールする。
Download Visual Studio Code

Unityの設定

デフォルトのスクリプトエディタをVSCodeに変更する

[Unity] → [Preferences] → [External Tools] → [External Script Editor] → [Browse]
finderが開くので「Visual Studio Code.app」を探してきて選択する。

[External Script Editor]に「Code」と表示されていればOK。
スクリーンショット 2019-05-02 3.27.56.png

VSCodeのおすすめ設定と拡張機能

設定

自動保存

[File] → [Auto Save]にチェックをつける。

自動整形

[Code] → [Prefarences] → [Settings]
で設定画面を開く
下記3つの項目にチェックをつける。

・Format On Paste
→ペースト時に自動でフォーマット
・Format On Save
→ファイル保存時に自動でフォーマット(自動保存では整形してくれないので、手動で「cmd+S」する必要あり)
・Format On Type
→入力した行を自動でフォーマット

また、後述の拡張機能「C# FixFormat」をインストールする。
これを入れて置かないと自動整形が働かないので注意。

ミニマップを非表示

横に出てくるやつです。個人的にいらなかったので非表示にしました。

[Code] → [Prefarences] → [Settings]
で設定画面を開く。
以下の項目のチェックを外す
・Editor › Minimap: Enabled


VS Codeのミニマップの表示/非表示を切り替えるには

拡張機能

C#

必須。C#が使えるようになる。

C# FixFormat

C#の自動整形ができるようになる。

Japanese Language Pack for Visual Studio Code

VSCodeの日本語化。

vscode-icons

ファイルとかフォルダにアイコンがついて見やすくなる。

Bracket Pair Colorizer

メソッドとかの{}を階層毎に色分けしてくれる。

zenkaku

コードに混ざった全角をわかりやすくしてくれる。

Debugger for Unity

デバッガー機能が使えるようになる。
image.png

C# XML Documentation Comments

sammaryを一瞬で表示できるようになる。

MonoBehaviour Snippets

Startメソッドとかを一瞬で書けるようになる。

Classy Naming

変数を新しく作るときに、変数名の候補を表示してくれる。

C# Extensions

C#のクラスを作れたりとか色々できる。

Rainbow CSV

csvを列ごとに色分けしてくれる。

参考

今日からUnity + Visual Studio Codeを用いた快適な開発生活(随時更新中)
VSCodeのオススメ拡張機能 24 選 (とTipsをいくつか)
VS CodeでUnityプログラミングしてる僕が入れてる拡張機能

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