20200210のC#に関する記事は5件です。

プレハブ化したオブジェクトの座標を取得

はじめに

この記事の対象者
・プレハブの座標を取得したい人
・オブジェクトの座標を取得したい人

プログラム

通常オブジェクトの場合

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

public class game Object : {
    public GameObject Prefab;
    void Start () {
    Debug.Log(Prefab.transform.position.x);//(オブジェクト.transform.position.座標)
    }

    void Update() {

    }
}

プレハブの場合

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

public class game Prefab: {
    public GameObject Prefab;
    void Start () {
    Prefab = GameObject.Find(Prefab);//Prefabをシーンから探してPrefabに代入する
    Debug.Log(Prefab.transform.position.x);//(オブジェクト.transform.position.座標)
    }

    void Update() {

    }
}

Findは処理が重くなってしまうのであまり多様するのは良くない

まとめ

[オブジェクト名.transform.position.座標]でオブジェクトの座標を取得する
[GameObject名 = GameObject.Find(オブジェクトの名前);]でプレハブを使えるようにする
詳しくはunity スクリプトリファレンスへどうぞ

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

VisualStudioのIntelliSenseが、Enterで決定できなくなった話(C#)

はじめに

ある日、C#でプログラミングをしていると、IntelliSenseをEnterとかで決定できなくなりました。
普通C#のIntelliSenseは、Enter以外にも、スペースとかピリオドを入力しても決定できるのです。決定できないのすごい不便…バグか…?

こんな感じに、枠で囲まれてはいるけど、選択状態になっていなくて、
2020021016434039.png

上下キー等を押すことで選択され、この状態ならEnterとかで補完できます。
2020021016441823.png

直し方探すの、なんて検索したらいいかもわからず、苦労しました…

なおしかた

IntelliSenseには、2つのモードがあるらしい。
完了モード(標準の完了モード)と、提案モード(提案される完了モード)というようです。

で、今回は、いつの間にかモードを提案モードに変更しちゃっていた、ということのようでした。バグじゃなかった。

完了モードと提案モードを切り替える方法はいくつかあります。好きな方法でやってください。

  • [CTRL] + [ALT] + [スペース]のショートカットを使う
  • メニューの『編集』→『IntelliSense』→『○○モードの切り替え』を押す
  • ツールバーの『テキストエディター』にある切り替えボタンを押す

[CTRL] + [スペース]でIntelliSenseを出すことができるじゃないですか。多分この時に、間違えて[CTRL] + [ALT] + [スペース]を入力しちゃったんだろうなぁ…IntelliSenseにモードがあるとか、初めて知ったよ…

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

Unityで最初から自動アタッチされてる状態にする 例

InspectorでReset選択時に自動アタッチ

InfoGetter.cs
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;

    /// <summary>
    /// お知らせ表示
    /// </summary>
    public class InfoGetter : MonoBehaviour
    {
        [Header("表示するオブジェクト")]
        [SerializeField]
        private GameObject prefab = null;
        [Header("表示させる場所の親")]
        [SerializeField]
        private Transform InstantiateParent = null;//Instantiateで複製したオブジェクトの親

        void Start()
        {
           CommonValues.Message.Reverse();
            for (int i = 0; i < CommonValues.Message.Count; i++)
            {
                GameObject item = GameObject.Instantiate(prefab, InstantiateParent);

                var text1 = item.FindChild("InfoText").GetComponent<Text>();
                text1.text = CommonValues.Message[i];

            }
        }

#if UNITY_EDITOR
        /// <summary>
        /// InspectorからReset選択時に自動アタッチ
        /// </summary>
        private void Reset()
        {
            //指定フォルダのprefabを全取得
            var guids_prefab = AssetDatabase.FindAssets("t:prefab", new string[] { "Assets/Prefabs" });

            for (int i = 0; i < guids_prefab.Length; i++)
            {
                //アタッチさせたいオブジェクト名を拡張子付きで書く
                prefab = AssetDatabase.LoadAssetAtPath<GameObject>("Assets/Prefabs/Info.prefab");

            }
            // ヒエラルキー上のすべてのオブジェクトを取得
            Object[] allGameObject = Resources.FindObjectsOfTypeAll(typeof(GameObject));
            // 取得したオブジェクトの名前を表示
            foreach (GameObject obj in allGameObject)
            {
                Debug.Log(obj.name);
                //アタッチさせたいオブジェクト名を書く
                if (obj.name == "InfoContent")
                {
                    InstantiateParent = obj.transform;

                }
            }
        }
    }
#endif


これで、gitであらぶってアタッチ抜けが起きても戻せる!

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

Uno Platform 入門 1 : Uno Platform とは? ~ C# で iOS, Android, Web, Windows 10 アプリを一気にクロスプラットフォーム開発~

C# で iOS, Android, Web, Windows 10 (UWP) アプリを一気に クロスプラットフォーム開発 できる、(UWP 向けのコードが他 3 プラットフォーム向けにビルドできるようになる) 、
アプリケーション開発フレームワーク である Uno Platform (ウノ プラットフォーム) を
触ってみたのでここに記録します。

(ちなみに現在アメリカ出張中なので、Microsoft オフィス近くのカフェでこの記事を書いています)

次の記事 『Uno Platform 入門 2 : 環境構築をしよう! Uno Platform ハローワールド

告知:2020年 3月 1日 (日) に、私たち 3 人で書いた Uno Platform 本「牛めし警察で学ぶ Uno Platform」を、 技術書典 (池袋) にて発売します!

Uno Platform とは

image.png

[https://platform.uno/]

Uno Platform とは、
オープンソースで開発されている、
クロスプラットフォーム開発ライブラリです。

公式ドキュメントを読んでみましょう。

The Uno Platform is a Universal Windows Platform Bridge that allows UWP-based code (C# and XAML) to run on iOS, Android, and WebAssembly.

(Uno Platform とは、UWP ベースのコード (C# + XAML) を iOS, Android, WebAssembly で動くようにする Universal Windows Platform Bridge です。)

要するに、
Uno Platform を使えば、C# + XAML だけで

  1. Windows 10 アプリ (UWP)
  2. iOS アプリ
  3. Android アプリ
  4. Web アプリ(WebAssembly)


一気に!
効率良く!
クロスプラットフォーム開発 (= 複数プラットフォーム間でソースコードを共通化しながら開発)!
できるというものです。

しかもオレオレ仕様ではなく、UWP ベースのコードが動くのが素晴らしいですね。(UWP 向けのコードが他プラットフォーム向けにビルドできるようになる)

こちらの、元 Microsoft MVP の biac さんの記事が詳しいのでご覧になってください。
UWPアプリを書けばiOS/Android/Webでも動く! Uno Platform:クロスプラットフォーム開発環境

XAML とは

XAML』(ザムル):

  • Extensible Application Markup Language の略
  • アプリ UI などを定義する用の XML ベースのマークアップ言語
  • UI を XAML で書いて、
    その裏の処理 (ボタンを押された時の処理など) を C# でプログラム、
    という流れになる

XAML 例

ボタンを表示させる XAML 例

<Button Background="Blue" Foreground="Red" Content="これはボタンです"/>

UWP とは

image.png

UWP (ユーダブリューピー) とは、
Universal Windows Platform のことで、
Windows 10 のコアです。

簡単に言うと
UWP アプリ」と言われたら
「ストアで配布可能な、 Windows 10 で動くアプリ
と思えば大体合ってます。

詳しく知りたい方はこちらの公式ドキュメントをどうぞ:
ユニバーサル Windows プラットフォーム (UWP) アプリとは - Microsoft 公式ドキュメント

Xamarin.Forms と Uno Platform

(* ゜▽゜ * っ)З「良いね! でも、あれ? C# + XAML でクロスプラットフォーム開発って、Xamarin (ザマリン) もそうじゃなかったっけ?」

たしかに、 Xamarin.Forms でも、
C# + XAML で
iOS, Android, UWP アプリが
クロスプラットフォーム開発できます。

でも Xamarin.Forms では Web アプリ開発はできません。

また、Xamarin.Form の XAML 記法は UWP とかの記法と違う記法だけど、
Uno Platform は UWP や WPF と同じように書けます。

一方、

Xamarin.Forms は Microsoft 公式が開発してるフレームワークで、とくに 2016 年の MS による Xamarin 買収以降、一気に物凄くしっかりしてきました。現在も多くの企業の大手アプリでの採用事例が広がっていっています。

また、Uno Platform は Xamarin を使って動いてる (後述) のですが、Xamarin.Forms は Xamarin 自身からリリースされてますし、そこも良さがあります。

Xamarin.Forms は各コンポーネントはプラットフォームネイティブの UI コンポーネントで構成されるので、単一コードで各プラットフォームに沿った UI をクラスプラットフォームで構築しやすいというメリットがありますが、反面設定できる項目が少なくカスタマイズ性が低いということになります。

これは どちらが優れているかという事ではなく、フレームワークの性質ということだと思うので、ケースによって判断すればよい と思います。

(ちなみに Uno Platform は Native Style を指定する事でプラットフォームネイティブのコンポーネントを同一画面内で混在させて使用する事が可能となっています)

(引用:Uno Platform のススメ より)

比較表

. Xamarin.Forms Uno Platform
読み方 ザマリン フォームズ ウノ プラットフォーム
ロゴ image.png image.png
開発元 Microsoft 社 nventive 社
誕生年 2014 年 2018 年
OSS? オープンソース オープンソース
開発言語 C# (+ XAML), F# (+ XAML) C# + XAML
XAML記法 UWP, WPF とは異なる UWP, WPF と同じ
開発可能プラットフォーム
(preview 版を除く)
iOS,
Android,
UWP (Windows 10)
iOS,
Android,
UWP (Windows 10),
WebAssembly (Web アプリ)

(Xamarin.Forms は preview 版なら macOSWPF なども対応しています)

Uno Platform の仕組み:Uno Platform は Xamarin の上で動いている

(* ゜▽゜ * っ)З「Uno PlatformXamarin とは関係ないの?」

あります!!

Uno PlatformXamarin の上で動いています!
(Microsoft 入社前は Xamarin でスマホアプリ開発していたプログラマーだったので、個人的にこれが一番熱い)

(* ゜▽゜ * っ)З「まあそうだよね、すでに C# が iOS, Android など向けにビルドできるようになる環境 (Xamarin) がオープンソースで開発されてるのに、それを使わないで独自にそこからイチから作るのは理にかなってないよね。既にあるものを利用するべきだよね」

Uno Platform

(上のアーキテクト図は 公式サイト より)

上の図を見ると、例えば、

一番左の UWP の欄、
我々の書くコードはもともと UWP のものなので、
UWP はそのまま UWP アプリ (Windows 10 アプリ) としてビルドされます。

そして iOS, Android アプリは、
我々プログラマーの書くコード (C#+XAML) の下に Uno Platform がいて、
その Uno Platform は Xamarin を使っていて、
その Xamarin は mono を使って動いています。

(mono は .NET 系 (C#) のランタイムのひとつ。これもオープンソース。mono があるから iOS, Android の上でも C# が動くよ。ちなみにゲームエンジンで有名な Unity も mono を使ってるよ)

そして Xamarin は WebAssembly をサポートしていないので、Uno Platform は mono を直接たたいて動いています。

参考資料

2020年3月1日(日) の 技術書典で
3人で書いた技術本『牛めし警察で学ぶ Uno Platform』を頒布します!

Microsoft MVP の ひらりんさん (@himarin269)、
Microsoft 社のエンジニアの かずきさん (@okazuki)
との 3 人で書きました!

image.png

参考記事: #技術書典 8 にて「牛めし警察で学ぶ Uno Platform」を頒布します!

こちらの本でも詳しく解説していきます。

次回記事

次の記事では環境構築について書きました!

→ 『Uno Platform 入門 2 : 環境構築をしよう! Uno Platform ハローワールド

image.png

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

[WPF, XAML] TabControl でWebっぽいメニューをつくる

Webとかでよく見るありがちなメニューをTabItemをできるだけシンプルにカスタマイズして再現してみました。
完成形↓
menu.png
まずはTabItemのスタイルを設定します。

TabControlMenu.xaml
<Style x:Key="Menu" TargetType="TabItem">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="TabItem">
        <Border Name="Border" CornerRadius="0" Margin="0" Padding="8,3,0,3" BorderThickness="0" Background="Transparent" Width="160">
          <Grid>
            <Grid.ColumnDefinitions>
              <ColumnDefinition Width="5"/>
              <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            <TextBlock Name="TextBlock" HorizontalAlignment="Left" VerticalAlignment="Bottom" Margin="0" FontSize="18" FontFamily="Yu Gothic" Foreground="white" Grid.Column="1" FontWeight="Bold">
              <ContentPresenter ContentSource="Header"/>
            </TextBlock>
          </Grid>
        </Border>
        <ControlTemplate.Triggers>
          <Trigger Property="IsSelected" Value="True">
            <Setter TargetName="Border" Property="Background" Value="#555"/>
            <Setter TargetName="Border" Property="BorderThickness" Value="0,0,2,0"/>
            <Setter TargetName="Border" Property="BorderBrush" Value="#cd3f37"/>
            <Setter TargetName="TextBlock" Property="Foreground" Value="#cd3f37"/>
            <Setter TargetName="Border" Property="Opacity" Value="0.9"/>
          </Trigger>
          <Trigger Property="IsSelected" Value="False">
            <Setter TargetName="Border" Property="Background" Value="transparent"/>
            <Setter TargetName="TextBlock" Property="Foreground" Value="#ccc"/>
            <Setter TargetName="Border" Property="BorderThickness" Value="0,0,0,0"/>
            <Setter TargetName="Border" Property="Opacity" Value="0.8"/>
          </Trigger>
          <Trigger Property="IsMouseOver" Value="True">
            <Setter TargetName="Border" Property="Cursor" Value="Hand"/>
            <Setter TargetName="Border" Property="Background" Value="#555"/>
            <Setter TargetName="Border" Property="Opacity" Value="1.0"/>
          </Trigger>
        </ControlTemplate.Triggers>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

つぎに本体部分。メニューの背景はBorderで作成し、その上にTabControlを置いています。
ダミーのタブを入れてスペースを作ってます。

TabControlMenu.xaml
<Grid>
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="161"/>
    <ColumnDefinition />
  </Grid.ColumnDefinitions>
  <Border Background="#333" BorderThickness="0,0,1,0" BorderBrush="#e8e8e8"/>
  <TabControl TabStripPlacement="Left" BorderThickness="0" Grid.ColumnSpan="2">
    <TabItem Style="{StaticResource Menu}" IsEnabled="False" Height="5"/>
    <TabItem Style="{StaticResource Menu}" IsSelected="True" Header="本日のおすすめ"/>
    <TabItem Style="{StaticResource Menu}" Header="おつまみ"/>
    <TabItem Style="{StaticResource Menu}" Header="魚"/>
    <TabItem Style="{StaticResource Menu}" Header="肉"/>
    <TabItem Style="{StaticResource Menu}" Header="飯・麺"/>
    <TabItem Style="{StaticResource Menu}" Header="ドリンク"/>
    <TabItem Style="{StaticResource Menu}" IsEnabled="False" Height="20"/>
    <TabItem Style="{StaticResource Menu}" Header="注文履歴"/>
  </TabControl>
</Grid>

こんな感じ。ね、簡単でしょ?
アイコンを付け加えると更にそれらしさが増します。

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