2017-01-17 6 views
1

나는 플랫폼에 서있는 공을 가지고 있으며 나는 스 와이프의 힘에 따라 공이 한 플랫폼에서 다른 플랫폼으로 스 와이프 할 때마다 코드가 작성되도록 코드를 작성했습니다. 순간에 내 플랫폼은 나 자신에 의해 위치에 배치하고 난 그들의 임의의 생성을위한 스크립트를 가지고 있지 않습니다. 내가 가지고있는 유일한 스크립트는 플레이어에서 스 와이프 및 앞으로 이동하는 것입니다.결합력 추가 기능을 사용하여 점프 동작을 스 와이프하는 법.

현재이 동작은 두 방향으로 힘을 가하여 앞뒤로 움직여 발사체 동작을 만듭니다. 그것의 일은 그것의 가정 된 것처럼 보이지만 운동은 너무 느립니다. 나는 그것을 더 빨리 움직이기를 원한다. Iwe는 공의 질량뿐만 아니라 힘으로 노는 것을 시도했다. 그들은 변화를 가져 오지만 여전히 공이 더 빨리 움직이기를 원합니다.

강제하는 것이 가장 좋은 방법입니까? 아니면 다른 방법을 권하고 싶습니까?

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 (); }'그런 다음 나머지 스크립트에서 GetComponent 대신 rb를 사용하십시오. 이론적으로 시간 눈금을 늘려 ('Time.timeScale = 2') 모든 것을 두 배 속도로 만들 수 있습니다. 그러나 나는 그것을 추천하지 않는다. 공이 빨리 움직이기를 원한다면, 더 많은 힘을 더하고 끌기를 증가 시키십시오. https://docs.unity3d.com/ScriptReference/Rigidbody-drag.html – Maakep

+0

문제가 해결 된 경우 적합한 것으로 받아들이십시오. _ 대답을 수락하면 미래의 방문자가이 페이지를 방문하는 데 도움이됩니다. _ – Kardux

답변

1

내가 @Fredrik 주석을 발견했을 때 내 대답을 기록했다 : 꽤 많이 그는 말했다 모두 내가 그렇게 쓴 나는 그냥 건너 뛸 수 있습니다 무엇에 있었다! (나는 또한 Time.timeScale 증가하지 않는 것이 좋습니다)

당신이 당신의 볼이 탄도 방정식을 사용하여 운동 학적으로 강체를 설정하는 것입니다 이동할 수있는 다른 방법. 이 방법을 사용하면 RigidBody.MovePosition()을 사용하여 코드를 통해 볼의 속도를 제어 할 수 있으며 여전히 OnCollision[...] 이벤트가 발생합니다.

또한 보조 객체로 collision.gameObject.name을 사용하여 충돌 객체 검사를하는 것이 아니라 큐브에 태그를 지정하거나 특정 레이어에 레이어를 설정하는 것도 권장됩니다 (하지만 내 생각에는 임시 코드 일 수 있습니다). 이 도움이

희망,

+0

답장을 보내 주셔서 감사합니다. 제대로 코딩하기 전에 프로젝트의 느낌을 얻는 데 필요한 치료 코드입니다. 이상적으로는 oncollision을 사용하지 않을 것입니다. ontrigger. 그냥 호기심에서, 왜 당신은 두 번째보다는 oncollision 하나를 선호합니까? 두 번째로, 여러분 중 누구도 스 와이프 입력을 얻은 다음 단순히이를 사용하여 변형 위치를 편집하여 발사체 모션처럼 보이게하지 않았습니다. 왜 너희들이 그런 말을하지 않는 이유가 있니? 그것 때문에 못생긴가? 또는 addforce/rigidbody.moveposition을 사용하는 것이 더 낫습니까? 그리고 왜? –

+0

질문이 하나 더 있는데 내 플레이어의 그림자가 왜 픽셀 화 된 것일까? 안드로이드 빌드 설정이 있습니다.결의안과 관련이 있거나, 내가 엉망인 검사관이 있습니까? –

+0

첫 번째 질문 : 'transform.position'을 수동으로 변경하면 단결 Physics를 망칠 가능성이 매우 높습니다 (예 : OnTriggerEnter/OnCollisionEnter 이벤트를 쉽게 놓칠 수 있음). 두 번째 질문에 대해 : 저는 누군가가 최근에 그렇게 물었던 것을 기억합니다. 그림자 설정 (소프트/하드, 해상도, 거리 등)을 가지고 놀아야 할 것 같아요.) – Kardux

0

하나는 AddForce에 두 번째 매개 변수로 ForceMode.VelocityChange에 합격하거나, 당신이 Time.fixedDeltaTime 덜되기 때문에 그것을 곱의 효과가 Time.fixedDeltaTime (하여 벡터를 나눌 확인 1보다 큼).