Unity2Dでオブジェクトへのクリックを取得する方法

Unity2Dでゲーム内に配置したオブジェクトをクリック(タップ)したい場合は、対象オブジェクトにCollider2DBoxCollider2DとかCircleCollider2Dなど)を設定した上でPhysics2D.Raycastを使って実装できます。

サンプル

void Update()
{
  if (Input.GetMouseButtonDown(0))
  {
    var mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
    var hit = Physics2D.Raycast(mousePosition, Vector2.zero);
    if (hit.collider != null)
    {
      // クリック位置にオブジェクトがある場合に実行したい処理
      Debug.Log(hit.collider.name);
    }
  }
}

※3D用のColliderと混同しないように気を付けてください。

リンク

Unity – Scripting API: Physics2D.Raycast
https://docs.unity3d.com/ScriptReference/Physics2D.Raycast.html

Unity – Scripting API: Collider2D
https://docs.unity3d.com/ScriptReference/Collider2D.html

プロキシ環境もしくはオフライン環境でUnityをインストールする方法

プロキシ環境下やオフライン環境でUnityをインストールする方法について。

Unity Hubを使わない場合/オフラインの場合

まず、インターネットに接続されているPCからUnityのアーカイブページにアクセスしてインストールしたいファイルをダウンロードしておきます。


https://unity3d.com/get-unity/download/archive

最低限必要なファイルは

  • Unity Editor (64-bit)

のみです。

Android/iOS Target Supportなどは必要な場合のみダウンロードしてください。

ダウンロードできたらファイルをインストールしたいPCに持って行ってダブルクリックでインストールできます。

インストール後のアクティベーションはManual Activationを選べばネット環境に寄らずセットアップできます。

Unity Hubを使う場合

こちらのページからUnity Hubをダウンロードして通常通りにインストールします。


https://unity.com/download

インストールできたら下記の内容でバッチファイル(.bat)を作成します。

@echo off
set HTTP_PROXY=http://プロキシのIPアドレス:ポート番号
set HTTPS_PROXY=http://プロキシのIPアドレス:ポート番号
start "" "<Unity Hubのインストール先>\Unity Hub.exe"

Unity Hubのインストール先は実際の環境に合わせてください。デフォルトの設定でインストールしている場合はC:\Program Files\Unity Hub\Unity Hub.exeになるかと思います。

作成できたらダブルクリックでバッチファイルからUnity Hubを起動して必要なバージョンのUnity Editorをインストールしてください。

アクセス制限している場合

プロキシサーバーでアクセス制限している場合は下記のドメインを許可しておく必要があります。

*.unity.com
*.unity3d.com

リンク

Unity – Manual: Offline (manual) license activation
https://docs.unity3d.com/Manual/ManualActivationGuide.html

Unity – Manual: Solving network issues
https://docs.unity3d.com/Manual/upm-config-network.html

C#でソースコードの行番号やファイル名を取得する方法

C++言語では__LINE____FILE__のマクロでソースコードの行番号やファイル名を取得することができます。C#でもこれと同じようなことをしたいと思って方法を調べてみました。

StackFrameを使う方法

using System;
using System.Diagnostics;

public class Example1
{
  public static void Main()
  {
    StackFrame stackFrame = new StackFrame(true);

    int fileLineNumber = stackFrame.GetFileLineNumber();
    string fileName = stackFrame.GetFileName();

    Console.WriteLine($"FileLineNumber: {fileLineNumber}");
    Console.WriteLine($"FileName: {fileName}");
  }
}

実行結果

FileLineNumber: 8
FileName: C:\work\example1.cs

CallerLineNumber/CallerFilePathを使う方法

using System;
using System.Runtime.CompilerServices;

public class Example2
{
  public static void Main()
  {
    test();
  }

  static void test([CallerLineNumber] int lineNumber = 0, [CallerFilePath] string filePath = null)
  {
    Console.WriteLine($"LineNumber: {lineNumber}");
    Console.WriteLine($"FilePath: {filePath}");
  }
}

実行結果

LineNumber: 8
FilePath: C:\work\example2.cs

ファイル名のみを取得したい場合

どちらの方法を使っても取得できるのはファイル名ではなく、ファイルパスになっています。ファイル名のみを取得したい場合はGetFileNameを使うと便利です。

string fileName = System.IO.Path.GetFileName(filePath);

リンク

StackFrame Class (System.Diagnostics) | Microsoft Docs
https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.stackframe?view=net-6.0

System.Runtime.CompilerServices Namespace | Microsoft Docs
https://docs.microsoft.com/en-us/dotnet/api/system.runtime.compilerservices?view=net-6.0