http://tsubakit1.hateblo.jp/entry/2016/04/11/070637
に記載のUnityの機能「IDragHandler」「IEndDragHandler」の扱い方がわかりません。
円形にボタンを配置したいのですが、この記事に記載の通りにスクリプトを書き、円のイメージを用意し、ボタンも用意しました。スクリプトの使用方法を教えてもらいたいです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答2件
0
GetOffsetAngleとSetOffsetAngleはsimpleCirlceLayoutGroupスクリプト内のoffsetAngleを下記の様に設定した物ですか?
public float GetOffsetAngle { get { return offsetAngle; } } public float SetOffsetAngle { set { offsetAngle = value; } }
layout.GetOffsetAngleとlayout.SetOffsetAngleの部分が赤線エラーで表示されるので差し支えなければ、少しエラー部分のアドバイスをして頂けないでしょうか?
私も同じサイトを通して円形に配置したUIへのスクロールを実装しようとしている者です。
投稿2020/09/25 08:01
総合スコア21
0
自己解決
空のゲームオブジェクトにアタッチし、親子関係でボタンを追加、その後に親にこのコードをアタッチすることにより解決```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
[RequireComponent(typeof(SimpleCircleLayoutGroup))]
public class SimpleCircleInterface : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
private SimpleCircleLayoutGroup layout;
private RectTransform layoutRect;
/// <summary>
/// 前フレームのマウスの位置
/// </summary>
private Vector2 previousPosition;
private float acceleration;
private bool isDragged = false;
/// <summary> /// 摩擦力 /// </summary> [SerializeField] private float drag = 0.33f; /// <summary> /// 最大の回転スピード(度/フレーム) /// </summary> [SerializeField] private float limit = 10f; void Awake() { layout = GetComponent<SimpleCircleLayoutGroup>(); layoutRect = layout.GetComponent<RectTransform>(); } void Update() { if (!isDragged) { var splitAngle = 360f / layoutRect.childCount; var targetAngle = Mathf.Round(layout.GetOffsetAngle() / splitAngle) * splitAngle; acceleration += Mathf.Clamp((targetAngle - layout.GetOffsetAngle()) * Time.deltaTime * 6f, -0.3f, 0.3f); } // accelerationは、*Time.deltaTimeでの調節を必要としない. すでに、OnDrag()でフレーム当たりの量になっているから. layout.SetOffsetAngle(layout.GetOffsetAngle() + acceleration); var delta = -(drag * Mathf.Sign(acceleration)) * Time.deltaTime * 40f; // *Time.deltaTimeすると滅茶小さくなるので、40fで大きくする. if (Mathf.Abs(acceleration + delta) > Mathf.Abs(acceleration)) // 最後の力を摩擦で止められたなら acceleration = 0f; else acceleration += delta; } void IBeginDragHandler.OnBeginDrag(PointerEventData eventData) { previousPosition = eventData.position; acceleration = 0f; isDragged = true; } public void OnDrag(PointerEventData eventData) { var currentPosition = eventData.position; float degree = Vector2.SignedAngle(previousPosition - (Vector2)layoutRect.position, currentPosition - (Vector2)layoutRect.position); degree = Mathf.Clamp(degree, -limit, limit); acceleration = degree; previousPosition = currentPosition; } /// <summary> /// いまは、まだ何もしない. /// </summary> /// <param name="eventData"></param> public void OnEndDrag(PointerEventData eventData) { isDragged = false; }
}
投稿2020/04/19 10:23
総合スコア21
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。