2015-11-29 2 views
0

Я пытаюсь «сжать» GameObject, когда Squeezer1 и Squeezer2 оба столкнулись с ним и продолжают двигаться друг к другу. Я хочу уменьшить ширину (масштаб x), так что общая площадь GameObject поддерживается , находясь между двумя Squeezers. Поскольку я не продвинутый программист, может ли кто-нибудь предоставить мне готовый к развертыванию скрипт? enter image description here«Сжатие» GameObject между двумя другими GameObjects?

Этот вопрос тесно связан с этим один: Question

+0

Чувак Вы должны предоставить более подробную информацию вроде - объекты соковыжималка имеют rigidbodies и коллайдеров? они перемещаются по сценарию или по физике? могут ли они двигаться полностью и касаться друг друга? У вас не может быть готового к развертыванию скрипта, если вы не даете никаких подробностей о среде, в которой должен работать ваш скрипт. Пожалуйста, не принимайте меня грубо, удачи! –

+0

Объекты Squeezer перемещаются по сценарию, имеют жесткие тела и коллайдеры и могут двигаться полностью. Можете ли вы написать ответ, пожалуйста? @NikaKasradze –

+0

это старая проблема .. вот ПОЛНОЕ РЕШЕНИЕ http://answers.unity3d.com/answers/432033/view.html – Fattie

ответ

0

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

Area = Width * Height 
Height = Area/NewWidth 
Width = NewWidth 

В трех измерениях можно предположить два компонента, которые вы хотите вывести, равны ...

Как я пишу это, я думаю, вы могли бы имитировать это правильно, с помощью пружин. Каждый край вашего квадрата/куба является пружиной, соединяющей углы. Шероховатость пружины должна быть определена, а l0 должна быть длиной, которую вы рассматриваете.

Небольшое напоминание о весеннем уравнения:

Let F be the force exerced by a spring 
l0 the length of the spring at rest 
l the current length of the spring 
k a constant that tweak the force (equivalent to the roughness of the spring) 

F = k * (l - l0) 

одна пружина не будет экономить площадь, если Защемление перпендикулярно к поверхности. В этом случае вам нужно будет обновить l0 неопределенного измерения.

+0

Замените 'l'' '' '' '' '' '' '' 'u'' – AgentFire

+0

Поскольку я не продвинутый программист, мне нужен готовый к развертыванию сценарий, как указано в вопросе. –

+0

Stackoverflow не предназначен для того, чтобы кто-то еще написал для вас весь код. Идея заключается в том, что вы используете этот совет и сами пишете код. – ILiveForVR

2
  1. Вы должны построить иерархию объектов
  2. Корневой объект не имеет ничего, кроме преобразования (kupMaster)
  3. Есть 3 различных геймобжекты под корневой объект
  4. Первый из них имеет все свойства куба, кроме коллайдеров, который называется cubeProps.
  5. Второй имеет трансформатор и коробчатый коллайдер, а этот коллайдер просто - обычный, который растягивает весь куб. Этот объект имеет также скрипт, и мы будем обрабатывать скрипку с помощью этого скрипта.
  6. У третьего есть транспортная система и коробчатый коллайдер. Когда куб скроется, куб будет иметь масштаб, поэтому вам нужно определить его масштаб, какой шахе вы хотите, чтобы ваш куб имел, когда он заскрипел.

Это дизайн enter image description here

Как работает скрипт?

  • У этого есть коробка, squezedbox, defaultScale, скорость и счетчик.

  • squezed box -> Объект squzedBox, подписанный сине-серым цветом по дизайну.

  • box -> cubeProps объект, который подписан зеленым цветом на дизайн.

  • defaultScale -> будет вашим масштабом по умолчанию. Вы можете назначить его в методе Start(). Он будет иметь масштаб коробки.

  • скорость -> Это значение, чтобы ваш куб визжал или отпускал себя как пружина.

Важно, чтобы мы изменили масштаб объекта box (cubeProps), поскольку он имеет компонент рендеринга сетки.

using UnityEngine; 
using System.Collections; 

public class normalBoxScript : MonoBehaviour { 

    private int counter; 
    public GameObject box; 
    public GameObject squezeBox; 
    private Vector3 defaultScale; 
    public float speed; 
    // Use this for initialization 
    void Start() { 
     defaultScale = box.transform.localScale; 
    } 
    void Update() { 
     Debug.Log(counter); 
     updateScale(); 
    } 
    void OnTriggerEnter(Collider col) 
    { 
     if (col.tag == "Player") 
     { 
      counter++; 
     } 
    } 
    void OnTriggerExit(Collider col) 
    { 
     if (col.tag == "Player") 
     { 
      counter--; 
     } 
    } 

    void updateScale() 
    { 
     if (counter == 2) 
     { 
      box.transform.localScale = Vector3.MoveTowards(box.transform.localScale, squezeBox.transform.localScale, speed); 
     } 
     else 
     { 
      box.transform.localScale = Vector3.MoveTowards(box.transform.localScale, defaultScale, speed); 
     } 
    } 
} 

И результат enter image description here

+0

Поскольку я не продвинутый программист, мне нужен сценарий с готовым развертыванием, который упоминается в вопросе. –

+0

Открытая награда за награду +200 началась с готового к развертыванию скрипта! –

+0

Благодарим за редактирование, но для того, чтобы получить репутацию +200, вы должны предоставить готовый к развертыванию *** скрипт ***. –

Смежные вопросы