Вторник, 26 Ноября 2024, 00:52

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
самописная физика, столкновения
zaicev9797Дата: Воскресенье, 07 Августа 2016, 11:13 | Сообщение # 1
AbRaKaDaBrA
Сейчас нет на сайте
решил попробовать самостоятельно написать свою физику для перемещения космического кораблика. Цели преследую две.
1) Создать более упрощенную физику, к примеру без различных фишек с трением и всевозможных симуляций ткани и прочего.
2) набраться опыта и скилла.
относительно реалистичное управление сделать получилось, а вот как лучше реализовать столкновения, я не знаю. Ведь без риджид бади функция onCollisionEnter не работает.
кто что может подсказать по этому поводу?

вот прилагаю на всякий случай скрипт в текущем его состоянии

Код
public class script : MonoBehaviour {

    public Vector3 velocity;
    public Vector3 angVelocity;
    public  float force;
    public float rotationForce;
    public float friction;
    public float angularFriction;

    public Transform globalGravityCenterTransform;
    public float gravityForce;

    // Update is called once per frame
    void Update () {
       
        ////////////////////////////
        if (Input.GetKeyDown(KeyCode.H))
        {
            Application.targetFrameRate = 20;
        }

        if (Input.GetKeyDown(KeyCode.G))
        {
            Application.targetFrameRate = 60;
        }
        ///////////////////////////

        velocity = velocity / (1.0f + (friction*Time.deltaTime));
        angVelocity = angVelocity /(1.0f + (angularFriction*Time.deltaTime));////трение
        transform.position += velocity*Time.deltaTime;
        transform.Rotate(angVelocity);///перемещение

        if (globalGravityCenterTransform != null)
        velocity += ((globalGravityCenterTransform.position - transform.position).normalized/(globalGravityCenterTransform.position - transform.position).magnitude)*gravityForce*Time.deltaTime;/// если есть центр притяжения, то форсит к нему

        if (Input.GetKey(KeyCode.W))
        {
            velocity += transform.forward*force * Time.deltaTime;////форс вперед
        }

        if (Input.GetKey(KeyCode.S))
        {
            velocity -= transform.forward*force * Time.deltaTime;///назад
        }

        Vector3 rotationVector = new Vector3(-Input.GetAxis("Mouse Y"),Input.GetAxis("Mouse X")) ;
        angVelocity += rotationVector * rotationForce * Time.deltaTime;///форс вращения

    }
}


проект Mysterious Space. The losted moment
OrdanДата: Понедельник, 08 Августа 2016, 01:32 | Сообщение # 2
Главный зомби
Сейчас нет на сайте
zaicev9797, Делай по старинке) Через координаты и параметры спрайта. Или же через пиксели(проверять если ли пиксель, что бы столкнуться)

Цитата недели: Из-за леса, из-за гор, кишки, месиво, хардкор. (Берсерк ТВ-2)

Мои проекты ТЫК
Мои видяхи на ютубэ ТЫК

Если ты споришь с идиотом, вероятно тоже самое делает и он.
NovaSurferДата: Четверг, 11 Августа 2016, 01:07 | Сообщение # 3
частый гость
Сейчас нет на сайте
А можно юзать от это - Renderer.bounds и от это Bounds.Intersects
Сейчас пример накидаю

Добавлено (08 августа 2016, 04:21)
---------------------------------------------

Код

using UnityEngine;
using System.Collections;

[ExecuteInEditMode] // Необязательно, но OnDrawGizmos() будет кидать null reference exception в редакторе

public abstract class DrawBounds : MonoBehaviour {

    protected Renderer currentRenderer;
    protected Color gizmoColor = Color.cyan;

    protected virtual void Awake()
    {
        currentRenderer = GetComponent<Renderer>();
    }

    private void OnDrawGizmos()
    {
        Vector3 center = currentRenderer.bounds.center;
        Vector3 size = currentRenderer.bounds.size;
        Gizmos.color = gizmoColor;
        Gizmos.DrawWireCube(center, size);
    }
}

------------------------------------
Код

using UnityEngine;
using System.Collections;

public class DrawBoxCollider : DrawBounds {

}

------------------------------------
Код

using UnityEngine;
using System.Collections;

public class BoundsCollider : DrawBoxCollider {

    public Renderer targetRend;

    void Update()
    {
        if (currentRenderer.bounds.Intersects(targetRend.bounds))
        {
            gizmoColor = Color.red;
        }
        else
        {
            gizmoColor = Color.cyan;
        }
    }
}

Добавлено (11 августа 2016, 01:07)
---------------------------------------------
Ну что, разобрались?


Мой блог - infcode.com

Сообщение отредактировал NovaSurfer - Понедельник, 08 Августа 2016, 03:33
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг