Sergomen
@Sergomen
Просто делай добро и оно вернётся

Как сделать перетаскивание с «примагничиванием»?

Я пытаюсь сделать так чтобы красные квадраты при перетаскивании над белыми "прилипали" к ним на какую-то часть секунды(ну не будет же так что игрок переместил на часть квадрата..). Но получается пока-что так как на записи( https://www.youtube.com/watch?v=WPLX8jlX72k )

мой код перемещения
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class drag : MonoBehaviour
{
    private Vector3 offset;
    private int score = 1;
    
    //public float distance = 1f;
    //public LayerMask mask;

    /*void FixedUpdate(){
        RaycastHit2D hit = Physics2D.Raycast(transform.position, -Vector2.left);
        Debug.DrawRay(transform.position, -Vector2.left * distance);
        
        if (hit.collider != null){
            Debug.Log(hit.collider.name);
        }
    }*/
    void OnMouseDown(){
        if (score == 1){
            offset = gameObject.transform.position - 
            Camera.main.ScreenToWorldPoint(
                new Vector3(Input.mousePosition.x, Input.mousePosition.y, -10.0f));
        }
    }
 
    void OnMouseDrag(){
        if (score == 1){
            Vector3 newPosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, -10.0f);
            transform.position = Camera.main.ScreenToWorldPoint(newPosition) + offset;
        }
    }

    void OnTriggerEnter2D(Collider2D other){
        if(other.gameObject.GetComponent<objTags>()){
            List<string> tags = other.gameObject.GetComponent<objTags>().tags;
            bool isNorm = false;
            
            foreach (string tag in tags){
                if (tag.Equals("norm"))
                    isNorm = true;
            }
            
            if (isNorm){
                Debug.Log(other.gameObject.transform.position);
                transform.position = new Vector3(other.gameObject.transform.position.x, 
                    other.gameObject.transform.position.y, transform.position.z);
                StartCoroutine(dragPause());
            }
        }
    }

    IEnumerator dragPause(){
        // while (true){
            score = 0;
            yield return new WaitForSeconds(0.1f);
            score = 1;
        // }
    }
}

Что я делаю не так?

p.s. возможно надо чтото уточнить; спрашивайте
  • Вопрос задан
  • 90 просмотров
Пригласить эксперта
Ответы на вопрос 1
@NIKROTOS
Начинающий программист.
Можно сдвигать с шагом в клетку, если это не даёт нужный эффект, посмотри информацию по задержкам:
https://docs.unity3d.com/ScriptReference/WaitForSe...
https://legkovopros.ru/questions/1428/dobav-te-vre...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы