1520
スコア表示などのGUI要素とキャラクターの位置が重なった時にGUI要素を半透明にしたいのですが、何か良い方法はありますか？  
Unity新バージョンのUI（通称uGUI）を使用したいのですが、まだ情報が出回っていないこともありどうしたら良いか分かりません。よろしくお願いします。
CC BY-SA 3.0
2014-12-11T08:05:39.127
1519
2014-12-12T23:00:48.013
2014-12-12T23:00:48.013
2129
2081
question
unity3d ugui
GUI要素とキャラクターの位置が重なった時にGUI要素の色を半透明に切り替えるには？
サンプルゲーム（UnityWebPlayer）  
  
<https://db.tt/LhaosH0F>

UIのデフォルトの座標はワールド座標ですがスケールが異なるため、プレーヤーの位置と比較するにはスクリーン座標に置き換えてやる必要があります。  
  
置き換えには RectTransformUtility.WorldToScreenPoint() を使用しましょう。  
  
また、この関数で座標を変換するにはカメラを指定する必要があるのですが、UIのCanvasに使用されるカメラは Hierarchy
上には表示されないので以下のように取得しましょう。

```

    public Canvas canvas;
    
    //UIの座標をスクリーン座標に変換
    Vector2 GetUIScreenPos (RectTransform rt) {
        return RectTransformUtility.WorldToScreenPoint(canvas.worldCamera,rt.position);
    }
    
```

指定する方法はなんでも良いですが、変換したいUIが所属している Canvas を指定します（今回なら Public
にしてエディタ上で直接指定しています）。そして、Canvas.worldCamera で Canvas を映しているカメラを取得し、
WorldToScreenPoint() で使用するという流れです。  

UIの座標は上記の方法で変換できますが、今回の場合比較するためにどこを変換するか、という問題もあります。  
今回の場合でしたら  
  
![](https://i.stack.imgur.com/M9lAz.png)  
  
  
のようにUI要素の角を指定してやって、例えば左上の Score
ならばスクリーン座標で矢印よりも左上にプレーヤーが移動した場合はテキストを半透明にしてやる、ということをしてやれば解決します。  
  
では、角に設置するためのUI要素の作成についてですが、対象のCanvas を Hierarchy 上で選択している状態でコンテキストクリック→ Create
Empty などで作成できます。  
  
  
  
また、Time Elapsed
のように、複数の角を設定してやる必要があるときは上記の方法しかないかもしれませんが、一つの角を指定するだけで事足りる場合は対象UI要素、例えば Score
の場合ならのアンカーを右下に設定しておくことで、変換用のUI要素に Score をそのまま使えるので無駄な空UI要素の作成を抑えることもできます。

プレーヤーの位置もスクリーン座標に変換する必要がありますが、こちらは Camera.main.WorldToScreenPoint() を使用します。  
Camera.main というのはシーンのメインカメラへのアクセスを意味します。

コードで書くと以下のようになります。

```

    Public Transfomr player;
    
    void Update() {
        var playerScreenPos = Camera.main.WorldToScreenPoint(player.position);
    }
    
```

あとは、playerScreenPos と上記のUI要素座標との比較に基づいてUI要素を透明にすれば良いですね。
CC BY-SA 3.0
2014-12-11T08:05:39.127
1520
2014-12-11T08:05:39.127
2081
1519
answer