2017-01-17 2 views
1

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

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

Является ли добавление силы лучшим способом для этого? Или вы порекомендовали бы другой способ?

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

public class SwipeScript : MonoBehaviour { 
public float maxTime; 
public float minSwipeDist; 

float startTime; 
float endTime; 

Vector3 startPos; 
Vector3 endPos; 
float swipeDistance; 
float swipeTime; 

// Use this for initialization 
void Start() 
{ 

} 

// Update is called once per frame 
void Update() 
{ 

    if (Input.touchCount > 0) 
    { 
     Touch touch = Input.GetTouch(0); 

     if (touch.phase == TouchPhase.Began) 
     { 
      startTime = Time.time; 
      startPos = touch.position; 
     } 
     else if (touch.phase == TouchPhase.Ended) 
     { 
      endTime = Time.time; 
      endPos = touch.position; 

      swipeDistance = (endPos - startPos).magnitude; 
      swipeTime = endTime - startTime; 

      if (swipeTime < maxTime && swipeDistance > minSwipeDist) 
      { 
       swipe(); 
      } 
     } 
    } 
} 

public void swipe() 
{ 
    Vector2 distance = endPos - startPos; 

    if (Mathf.Abs(distance.y) > Mathf.Abs(distance.x)) 
    { 
     Debug.Log("Swipe up detected"); 
     jump(); 
    } 

} 
private void jump() 
{ 
    Vector2 distance = endPos - startPos; 
    GetComponent<Rigidbody>().AddForce(new Vector3(0, Mathf.Abs(distance.y/5), Mathf.Abs(distance.y/5))); 
} 

private void OnCollisionEnter(Collision collision) 
{ 
    if (collision.gameObject.name == "Cube (1)") { 
     Debug.Log("collision!"); 
     GetComponent<Rigidbody>().velocity = Vector3.zero; 
     GetComponent<Rigidbody>().angularVelocity = Vector3.zero; 
    } 
} 

}

why is the ball shadow so pixelated by the way?

+1

Просто быстрый совет: сохраните Rigidbody в 'Start()', поэтому вам не нужно использовать GetComponent каждый раз, когда вы хотите его использовать, что не очень оптимизировано. Это также сделает ваш код более чистым. 'Rigidbody rb; Start() {rb = GetComponent (); } ', а затем используйте rb вместо GetComponent в остальной части скрипта. Вы могли бы теоретически увеличить временные рамки ('Time.timeScale = 2'), чтобы сделать все вдвое больше скорости. Но я не рекомендую. Если вы хотите, чтобы мяч двигался быстрее, вы добавляете больше силы и увеличиваете сопротивление. https://docs.unity3d.com/ScriptReference/Rigidbody-drag.html – Maakep

+0

Если какой-либо ответ решает вашу проблему, подумайте о том, чтобы принять его как правильный. _ (Принятие ответа помогает будущим посетителям, выходящим на эту страницу) _ – Kardux

ответ

1

я писал свой ответ, когда я заметил @Fredrik комментарий: почти все, что он сказал, было в том, что я написал, так что я просто пропустить его! (я также не рекомендую увеличить Time.timeScale)

Другого путь вы можете переместить ваш шар будет использовать баллистические уравнения и настройку вашего Rigidbody в кинематический. Таким образом, вы сможете контролировать скорость шага с помощью кода с помощью RigidBody.MovePosition() и все равно получать OnCollision[...] событий.

Кроме того, в качестве примечания я не рекомендую использовать collision.gameObject.name для проверки объекта столкновения, но вместо того, чтобы пометить ваши кубы или даже установить их слой на определенный (но, я думаю, это может быть ваш временный код;)).

Надеется, что это помогает,

+0

Спасибо за ответ, это всего лишь код scrapy, чтобы получить представление о проекте, прежде чем я начну правильно кодировать, в идеале я бы не использовал oncollision, но, как вы сказали, теги с ontrigger. Просто из любопытства, почему вы предпочитаете второй вариант, а не oncollision. Во-вторых, ни один из вас не сказал что-то вроде того, что получил вход для салфетки, а затем просто использовал это, чтобы отредактировать позиции преобразования, чтобы некоторые выглядели как движение снаряда. Есть ли причина, почему вы, ребята, не сказали что-то подобное? Это потому, что его уродливость? или что использование addforce/rigidbody.moveposition лучше? и почему? –

+0

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

+0

О вашем первом вопросе: если вы меняете «transform.position» вручную, шансы на беспорядок с единством. Физика действительно высока (например, вы можете легко пропустить событие OnTriggerEnter'/'OnCollisionEnter'), вот почему он очень рекомендую (я мог бы даже сказать, что это запрещено), чтобы сделать это;) О вашем втором вопросе: я помню, что кто-то спросил его недавно о SO, я думаю, вам нужно играть с настройками тени (мягкая/твердая, разрешение, расстояние и т. д.)) – Kardux

0

Либо пройти ForceMode.VelocityChange в качестве второго параметра AddForce, или убедитесь, что вы разделите вектор на Time.fixedDeltaTime (который имеет эффект умножения, потому что Time.fixedDeltaTime будет меньше чем 1).