Помогите написать скрипт грабинга (Take, Grab)

Общие вопросы о Unity3D

Помогите написать скрипт грабинга (Take, Grab)

Сообщение Morri 23 апр 2023, 03:42

Take, Grab - или же русскими словами подбор предметов

Глупо обращатся за помощью без кода, но это так (popcorn)
У меня есть что то но оно мне не нравится
Синтаксис:
Используется csharp
using System;
using System.Collections;
using System.Linq;
using UnityEngine;

public class Take : MonoBehaviour
{
        float distance = 3;
        public Transform pos;
        private Rigidbody rb;
        private Take_Is taked;

        private void Start ()
        {
                rb = GetComponent<Rigidbody>();
                taked = GameObject.Find("First Person Controller").GetComponent<Take_Is>();
        }

        private void OnMouseDown()
        {
                Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                RaycastHit hit;
                if (Physics.Raycast(ray, out hit, distance) && taked.Take==false)
                {
                taked.Take = true;
                rb.isKinematic = true;
                rb.MovePosition(pos.position);
                }
        }
       
        private void FixedUpdate ()
        {
                if (rb.isKinematic)
                {
                transform.position = pos.position;
                if (Input.GetKeyDown(KeyCode.Mouse0) && taked.Take==true)
                {
                        taked.Take = false;
                        rb.isKinematic = false;
                        rb.AddForce(Camera.main.transform.forward * 500);
                }
                }
        }
}
 


Мне нужно:

1. Возможность переворота объектов на колесико мышки
2. Я не хочу чтобы объект привязывался к позиции Take, Я хочу чтобы он брался с позиции где и лежал (стоял)
3. Чтобы можно было нормально выбросить объект - в моей нароботке пока не отведешь камеру от объекта то не выбросишь его
Я хочу сделать принцип как в играх - My Summer Car, Mon Bazou

Я буду рад если мне помогут (popcorn)
Morri
UNец
 
Сообщения: 4
Зарегистрирован: 16 апр 2023, 16:25

Re: Помогите написать скрипт грабинга (Take, Grab)

Сообщение 1max1 23 апр 2023, 12:33

Когда-то писал какой-то граббер, можешь взять для примера, но его само собой надо допиливать.

Вешаешь на объект, на объекте должен быть коллайдер.



Синтаксис:
Используется csharp
using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;

[RequireComponent(typeof(Collider))]
public class ObjectGrabber : MonoBehaviour
{
    float? distance = null;

    void OnMouseDown()
    {
        distance = (Camera.main.transform.position - transform.position).magnitude;
    }

    void LateUpdate()
    {
        if (distance != null)
        {
            // Position correction.

            var newPosition = transform.position;

            Camera mainCamera = Camera.main;

            int oldLayer = gameObject.layer;

            gameObject.layer = LayerMask.NameToLayer("Ignore Raycast");

            var ray = new Ray(mainCamera.transform.position, mainCamera.transform.forward);

            var hits = Physics.RaycastAll(ray, distance.Value);

            if (hits.Length > 0)
            {
                var minDistance = Vector3.Distance(mainCamera.transform.position, hits[0].point);

                for (int i = 1; i < hits.Length; ++i)
                {
                    var nextDistance = Vector3.Distance(mainCamera.transform.position, hits[i].point);

                    if (nextDistance < minDistance)
                    {
                        minDistance = nextDistance;
                    }
                }

                newPosition = mainCamera.transform.position + mainCamera.transform.forward * minDistance;
            }
            else
                newPosition = mainCamera.transform.position + mainCamera.transform.forward * distance.Value;

            gameObject.layer = oldLayer;

            // Move.

            transform.position = Vector3.Lerp(transform.position, newPosition, 9.0f * Time.deltaTime);

            // Align position.

            var myCollider = GetComponent<Collider>();

            var nearColliders = new List<Collider>(
                Physics.OverlapSphere(
                    transform.position, myCollider.bounds.size.magnitude));

            nearColliders.Remove(myCollider);

            foreach (var collider in nearColliders)
            {
                if (Physics.ComputePenetration(
                    myCollider, myCollider.transform.position, myCollider.transform.rotation,
                    collider, collider.transform.position, collider.transform.rotation,
                    out Vector3 direction, out float distance))
                {
                    transform.position += direction * distance;
                }
            }

            // Reset.

            if (Input.GetMouseButtonUp(0))
            {
                distance = null;
            }
        }
    }
}
 
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51


Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9