Unity C # 'устанавливает позицию спрайта в указатель мыши' делает спрайт клип через другие спрайты - PullRequest
0 голосов
/ 05 февраля 2019

(извините, если форматирование или что-то еще некорректно, я уже давно использую stackoverflow, никогда раньше не задавал вопросов. Плюс, я новичок в unity и c #)

Не могу опубликоватьизображения, но вот ссылка на imgur

https://imgur.com/a/jcki1qd

(извините, у меня много проблем с описанием вещей, и я думаю, что изображение поможет)

Iу меня есть простой код для кругового спрайта с круговой картой спрайтов, которая прикреплена к пружине, и когда я удерживаю спрайт, перетаскиваю его назад и отпускаю мышь, объект летит в направлении, противоположном тому, куда я перетащил его обратно (почти злые птицы любят запускать).Но когда я держу спрайт, я могу обрезать его через другие спрайты на моем уровне, и даже за его пределами.Мяч плывет, и игра должна быть в состоянии перетащить и запустить его в любом направлении.

Я пытался установить силу разрыва пружины на довольно низкий уровень, поэтому мяч не запускается, еслиЯ вытягиваю его слишком далеко, но мяч все еще следует за моей мышью, когда я тащу его, и когда я отпускаю его после весенних каникул, шар просто падает вниз.

Кроме того, я попытался ограничить радиуспружина, ограничивая ее длину.Но это не сработало.

            using System.Collections;
            using System.Collections.Generic;
            using UnityEngine;

            public class LaunchScript : MonoBehaviour
            {
              public Rigidbody2D rb;
              private bool isPressed = false;
              public float releaseTime = 0.15f;

                private void Update()
                {
                    if (isPressed)
                    {
                        rb.position = Camera.main.ScreenToWorldPoint(Input.mousePosition);
                    }
                }
                // Start is called before the first frame update
                void OnMouseDown()
                {
                    isPressed = true;
                    rb.isKinematic = true;
                }

                // Update is called once per frame
                private void OnMouseUp()
                {
                    isPressed = false;
                    rb.isKinematic = false;
                    StartCoroutine(Release());
                }
                IEnumerator Release()
                {
                    yield return new WaitForSeconds(releaseTime);
                    GetComponent<SpringJoint2D>().enabled = false;
                    this.enabled = false;
                }
        }

Мои ожидаемые результаты были такими: мяч следовал за мышью и мог тянуться назад, но не проходил через зеленые наземные блоки, корзину,или граничные блоки (блоки, используемые для предотвращения вылетания мяча за пределы поля).Мои реальные результаты были такими: я мог перетащить мяч в любую точку экрана, в том числе прямо в зеленую землю и за ее пределы.

1 Ответ

0 голосов
/ 05 февраля 2019

Кинематический коллайдер с твердым телом может обнаруживать столкновения только с коллайдером с твердым телом (коллайдер с некинематическим твердым телом) в режиме без триггера.

Из Unity Руководство: Коллайдеры :

Даже будучи неподвижными кинематические коллайдеры с твердым телом ведут себя иначе, чем статические коллайдеры.Например, если коллайдер установлен в качестве триггера, вам также необходимо добавить к нему жесткое тело для получения событий триггера в вашем скрипте.Если вы не хотите, чтобы триггер падал под действием силы тяжести или иным образом подвергался влиянию физики, вы можете установить свойство IsKinematic для его твердого тела.

Попробуйте поиграть с isKinematic (например, включить / отключить реверс)или удали его) и отключи isTrigger.И не забывайте о коллайдерах и твердых телах на вашем шаре и окружающей среде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...