KaRaMiD
@KaRaMiD
Хочу научится делать игры на Unity

Как сделать правильное подбирание и передвижение предметов в Unity 3D?

У меня есть проблема когда я подношу предмет себе под ноги то персонаж и коробка начинает двигаться туда-сюда.
610b13c2a57e8644050541.png
И я хочу это исправить, у меня была идея ограничить передвижение объекта по Y, но я не знаю как это сделать.
И еще я не знаю как сделать подбирание и отпускание предмета по нажатию кнопки.

Скрипт стоит на коробке

Код:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TakeControll : MonoBehaviour
{
    [Header("For take and throw")]
    private bool isTaken = false;
    private bool canHold = true;
    public float throwForce = 200f;
    public float distance;

    private Vector3 objPos;
    public GameObject DotForTake;
    public Transform DotForTake1;
    public Vector3 DotForTake2;

    [Header("For normaly take obj.y")]
    private Vector3 testForNormalTake;

    void Start()
    {
        DotForTake2 = DotForTake1.transform.position;
        testForNormalTake.y = DotForTake2.y;
    }

    void FixedUpdate()
    {
        distance = Vector3.Distance(this.transform.position, DotForTake.transform.position);
        if (distance >= 1f)
        {
            isTaken = false;
        }
        if (isTaken == true)
        {
            this.transform.Rotate(new Vector3(0, 0, 0));
            this.GetComponent<Rigidbody>().velocity = Vector3.zero;
            this.GetComponent<Rigidbody>().angularVelocity = Vector3.zero;
            this.transform.position = DotForTake1.position;

            if (Input.GetMouseButtonDown(0))
            {
                //throw
                this.GetComponent<Rigidbody>().AddForce(DotForTake.transform.forward * throwForce);
                isTaken = false;
            }

            
        }
        else
        {
            objPos = this.transform.position;
            this.transform.SetParent(null);
            this.GetComponent<Rigidbody>().useGravity = true;
            this.transform.position = objPos;
        }
    }

    void OnMouseOver()
    {
        if (Input.GetKeyDown(KeyCode.E))
        {
                if (distance <= 1f)
                {
                    isTaken = true;
                    this.GetComponent<Rigidbody>().useGravity = false;
                    this.GetComponent<Rigidbody>().detectCollisions = true;
                }
            }
            if (Input.GetKeyUp(KeyCode.E))
            {
                isTaken = false;
            }
        }
}

DotForTake, DotForTake1, DotForTake2 это точка, где весит объект когда isTaken = true
610b13a9079dc474605295.png

Помогите пожалуйста
  • Вопрос задан
  • 298 просмотров
Пригласить эксперта
Ответы на вопрос 1
@NIKROTOS
Начинающий программист.
повесь триггер на кубик(больше кубика) и если кубик пересекается с таскающим , то на себя не двигать. Триггер можно делать в момент взятия объекта.
В книге юнити в действии в начале, при описании работы с мышкой, описано как реализовать похожее ограничение: стр. 49
https://www.rulit.me/data/programs/resources/pdf/H...
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы