Visual Studio Code で .NET Core をやろうとしたらエラーが起きたので解決した

最近は Visual Studio Code でも C# が動くんですね!

Visual Studio なんていらんかったんや!

docs.microsoft.com

ということで、公式チュートリアルの通りにやってみたところ……。

問題発生

f:id:Gigacee:20190209025920j:plain

本来ならアプリのビルドとデバッグに必要なアセットの追加を求められるべきところで、なにやら怪しげな警告が。

恐る恐る内容を開いてみると……。

[info]: OmniSharp.Stdio.Host
        Starting OmniSharp on Windows 6.2.9200.0 (x64)
[info]: OmniSharp.Services.DotNetCliService
        DotNetPath set to dotnet
[info]: OmniSharp.MSBuild.Discovery.MSBuildLocator
        Located 2 MSBuild instance(s)
            1: Visual Studio Community 2017 15.8.28010.2048 - "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin"
            2: StandAlone 15.0 - "C:\Users\Gigacee\.vscode\extensions\ms-vscode.csharp-1.17.1\.omnisharp\1.32.8\msbuild\15.0\Bin"
[info]: OmniSharp.MSBuild.Discovery.MSBuildLocator
        Registered MSBuild instance: Visual Studio Community 2017 15.8.28010.2048 - "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin"

// 中略

[fail]: OmniSharp.MSBuild.ProjectManager
        Attemped to update project that is not loaded: c:\Users\Gigacee\Sandbox\dotnet\Hello World.csproj

どうやら、 Visual Studio Code の C# 拡張ではなく、 Visual Studio Community 2017 の MSBuild を呼んでしまってエラーが起こっているようです。

Visual Studio をアンインストールしてしまえば解決しそうですが、 Unity でゲーム開発をするときとかにまだ使うんですよね……。

(さっき「いらんかったんや!」と言ったばかりですが……)

解決

なんとか Visual Studio を生かしたまま解決できないかと色々試した結果、 Visual Studio 自体に .NET Core をインストールすることでうまくいきました。

Visual Studio Installer を起動し、「変更」から、「.NET Core クロスプラットフォームの開発」をインストールすれば OK !

f:id:Gigacee:20190209034637p:plain

なんで自分自身の MSBuild より外部の MSBuild の方が優先されるんですかね……謎です。

なお OmniSharp の GitHub では

github.com

問題自体は認識されているようです。

早く直ると良いですね。

元 Flash エンジニアから見る Unity の Timeline ~ラベル編~

前置き・ Flash のタイムライン

Flash (現 Animate) のタイムラインは、任意のフレームにラベルを設定しておき、

this.gotoAndPlay("ラベル名");

とか書いてやれば、どこからでもそのラベルにジャンプできるという、大変便利な機能がありました。

この記事では、 Unity の Timeline でも Flash のラベルみたいなことを実現するための手法を紹介します。

Control Clip を Label 代わりにする

まず、 Timeline に Control Track を追加します。

そして、 Track を右クリックし、「Add Control Playable Asset Clip」を選択して、 Control Clip を作成します。

f:id:Gigacee:20180709194523p:plain

この Control Clip ですが、図のように Inspector から好きな名前を付けることができます。

これを利用して、ラベルのようなものを作ろうというわけです。

そうして出来上がったのがコチラ。ついでに Track 名も "Label" にしています。

f:id:Gigacee:20180709201442g:plain
判りやすいように、 cube をアニメーションさせています。

スクリプトから Timeline を制御

次に、設定した各ラベルにジャンプしたりするためのスクリプトを書きます。

考え方としては単純で、 GetClips() で Label トラックの全クリップ(scene1 とか)を取得して、それぞれのクリップ名をキー、クリップの開始位置を値とした連想配列を作り、ラベル情報として取っておくだけです。

using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;

public class TimelineController : MonoBehaviour
{
    PlayableDirector timeline;
    Dictionary<string, double> labels;

    void Start()
    {
        timeline = GetComponent<PlayableDirector>();

        labels = ((TimelineAsset)timeline.playableAsset)
            .GetOutputTracks()
            .Single(x => x.name == "Label")
            .GetClips()
            .ToDictionary(
                clip => clip.displayName,
                clip => clip.start);
    }

    public void GotoAndPlay(string label)
    {
        timeline.time = labels[label];
        timeline.Evaluate();
        timeline.Play();
    }

    public void GotoAndStop(string label)
    {
        timeline.time = labels[label];
        timeline.Evaluate();
        timeline.Pause();
    }

    public void Play()
    {
        timeline.Play();
    }

    public void Stop()
    {
        timeline.Pause();
    }
}

このスクリプトを、 Timeline がアタッチされているのと同じ GameObject にアタッチすれば OK 。

あとは、適当な UI で関数を呼び出してあげれば……。

f:id:Gigacee:20180709205814g:plain

この通り! Flash の gotoAndPlay("ラベル名")gotoAndStop("ラベル名") のように、任意のラベルにジャンプできるようになりました!

The coloring of this site is Dracula PRO🧛🏻‍♂️
This website uses the FontAwesome icons licensed under CC BY 4.0.

2020 GIGA CREATION