1.はじめに
本記事には私が思いついたこと・学習したこと等をメモとして書いていきます。場合によってはタイトルから少し外れた内容も含まれるかもしれませんし、言葉が足りない・知識が間違っている部分もあるかもしれません。できる限り事細かく書きますので、なにかの参考になればと思います。
2.本編
Ⅰ.パズルピースをドラッグで動かす
| 使った関数 | 関数の意味 |
|---|---|
| OnMouseDrag() | オブジェクトがマウスでドラッグ判定時に行われる |
| Input.mousePosition | マウスの座標(ワールド座標を取得する) |
| Camera.main.ScreenToWorldPoint() | ワールド座標をカメラスクリーン座標に変換する |
コード例
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Move_piece : MonoBehaviour {
private void OnMouseDrag()
{
Vector3 ObjPos = Input.mousePosition;
ObjPos.z = 10f;
transform.position = Camera.main.ScreenToWorldPoint(ObjPos);
}
}
ObjPosという座標の格納変数を用意します。最終的に、この変数の座標がオブジェクトの位置になります。
ObjPos.z = 10f;
このコードがなければオブジェクトのz座標が0となり、ゲーム画面でうまく表示されません。
transform.position = Camera.main.ScreenToWorldPoint(ObjPos);
Debug.Log(ObjPos)で確認できると思いますが、このコードによってワールド座標とスクリーン座標を切り替えています。
通常mousePositionはワールド座標であるため、そのままObjPosに代入するとゲーム画面ではゲーム画面の遥か彼方に飛ばされます。
Ⅱ.ピースがはまるときの挙動
各ピースに目的の座標を設定しておき、その点に任意の距離ほど近づいた際、設定した座標にワープすることで「穴にはまるパズルピースの挙動」を目指しまた。
| 使った関数 | 関数の意味 |
|---|---|
| OnMouseUp() | オブジェクトからマウスを離した時に行われる |
| Mathf.Abs() | ()内の絶対値をとる |
コード例
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Move_piece : MonoBehaviour {
public Vector3 GoalPos;
public float span;
private void OnMouseDrag()
{
Vector3 ObjPos = Input.mousePosition;
ObjPos.z = 10f;
transform.position = Camera.main.ScreenToWorldPoint(ObjPos);
Debug.Log(Input.mousePosition);
}
private void OnMouseUp()
{
float x_length = Mathf.Abs(GoalPos.x - transform.position.x);
float y_length = Mathf.Abs(GoalPos.y - transform.position.y);
if (x_length <= span && y_length <= span)
{
transform.position = GoalPos;
}
}
}
OnMouseUp()をさらに追加しました。
spanに任意に距離を設定し、ドラッグ後のオブジェクトの座標と目的の座標の距離の絶対値をspanと比較し、span以下だった場合にワープさせています。
Ⅲ.実行例

spanの値を調整することで、ピースがワープする距離を変更できます。
3.まとめ
今回はピースの目的位置を座標として与えましたが、パズルによっては複数の穴にはまるものもあります。その場合、Rayを使って穴を取得し、もっとも近い穴にワープするというのも手かもしれません。
以上をもちまして、「パズルピースの挙動」とさせていただきます。
少しでも参考にでもなればと思います。ありがとうございました!