「Unity/Csharp/オブジェクトをドラッグ」の版間の差分
ナビゲーションに移動
検索に移動
| (同じ利用者による、間の1版が非表示) | |||
| 53行目: | 53行目: | ||
==別の方法その1== | ==別の方法その1== | ||
Rididbody2DとCollider2D追加 | |||
<pre> | <pre> | ||
using UnityEngine; | using UnityEngine; | ||
| 79行目: | 80行目: | ||
参考:http://matorierunormal.sblo.jp/article/187233424.html | 参考:http://matorierunormal.sblo.jp/article/187233424.html | ||
==別の方法その2== | |||
Image座標のオフセット付きで、上下のドラッグ | |||
<pre> | |||
using UnityEngine; | |||
using UnityEngine.EventSystems; | |||
public class PositionImageScript : MonoBehaviour, IDragHandler, IBeginDragHandler | |||
{ | |||
private Vector3 dragOffset; | |||
public void OnBeginDrag(PointerEventData data) | |||
{ | |||
Vector3 worldTouch = Camera.main.ScreenToWorldPoint(data.position); | |||
worldTouch.z = 0; | |||
dragOffset = transform.position - worldTouch; | |||
} | |||
public void OnDrag(PointerEventData data) | |||
{ | |||
Vector3 worldTouch = Camera.main.ScreenToWorldPoint(data.position); | |||
worldTouch.z = 0; | |||
Vector3 targetPos = worldTouch + dragOffset; | |||
// 制限 | |||
targetPos.x = 0; | |||
transform.position = targetPos; | |||
Debug.Log("transform.position.y=" + transform.position.y); | |||
} | |||
} | |||
</pre> | |||
2026年2月7日 (土) 08:35時点における最新版
unity2020の場合
using UnityEngine;
using UnityEngine.EventSystems;
public class BlockScript : MonoBehaviour, IDragHandler, IDropHandler
{
public void OnDrag(PointerEventData eventData)
{
Vector3 objectPointInScreen = Camera.main.WorldToScreenPoint(eventData.position);
Vector3 mousePointInScreen = new Vector3(Input.mousePosition.x,
Input.mousePosition.y,
objectPointInScreen.z);
Vector3 mousePointInWorld = Camera.main.ScreenToWorldPoint(mousePointInScreen);
mousePointInWorld.z = this.transform.position.z;
this.transform.position = mousePointInWorld;
}
public void OnDrop(PointerEventData eventData)
{
//Destroy(gameObject);
}
}
上記は、以下の項目と違って、Colliderは不要。
unity2019?
unity2020だと以下は動作しなかったので・・
画像オブジェクトにColliderをつけ以下コードをアタッチ(Add Component)するとドラッグでオブジェクトが動かせるようになる
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BlockScript : MonoBehaviour {
void Start () {
}
void Update () {
}
void OnMouseDrag()
{
Vector3 objectPointInScreen = Camera.main.WorldToScreenPoint(this.transform.position);
Vector3 mousePointInScreen = new Vector3(Input.mousePosition.x,
Input.mousePosition.y,
objectPointInScreen.z);
Vector3 mousePointInWorld = Camera.main.ScreenToWorldPoint(mousePointInScreen);
mousePointInWorld.z = this.transform.position.z;
this.transform.position = mousePointInWorld;
}
}
参考
別の方法その1
Rididbody2DとCollider2D追加
using UnityEngine;
using UnityEngine.EventSystems;
public class DragImage : MonoBehaviour, IBeginDragHandler, IDragHandler
{
private Vector2 prevPos;
public void OnBeginDrag(PointerEventData eventData)
{
prevPos = transform.position;
}
public void OnDrag(PointerEventData eventData)
{
transform.position = eventData.position;
}
public void OnEndDrag(PointerEventData eventData)
{
transform.position = eventData.position - prevPos;
}
}
参考:http://matorierunormal.sblo.jp/article/187233424.html
別の方法その2
Image座標のオフセット付きで、上下のドラッグ
using UnityEngine;
using UnityEngine.EventSystems;
public class PositionImageScript : MonoBehaviour, IDragHandler, IBeginDragHandler
{
private Vector3 dragOffset;
public void OnBeginDrag(PointerEventData data)
{
Vector3 worldTouch = Camera.main.ScreenToWorldPoint(data.position);
worldTouch.z = 0;
dragOffset = transform.position - worldTouch;
}
public void OnDrag(PointerEventData data)
{
Vector3 worldTouch = Camera.main.ScreenToWorldPoint(data.position);
worldTouch.z = 0;
Vector3 targetPos = worldTouch + dragOffset;
// 制限
targetPos.x = 0;
transform.position = targetPos;
Debug.Log("transform.position.y=" + transform.position.y);
}
}