2016-06-18 5 views
0

Ich will mein Objekt abhängig ich auf welcher Seite nach links oder rechts kippen bin mein Telefon kippen, während Objekt vorwärts bewegt, hier ist mein Code, der nicht richtig funktioniert ..neigbare in Einheit

void Update() { 
    transform.Translate(Vector3.forward * Time.deltaTime); 
    if (Input.acceleration.x > 1) { 
     transform.Rotate(90,0,0); 
    } 
    else if (Input.acceleration.x < -1) { 
     transform.Rotate(-90,0,0); 
    } 

Alle Art der Hilfe wird sehr geschätzt werden. Danke.

+0

Haben Sie den Code in meiner Antwort getestet? – Programmer

Antwort

0

Gebrauch diese statt:

private Quaternion localRotation; 
public float speed = 1.0f; 
void Start() 
{ 
localRotation = transform.rotation; 
} 
void Update() 
{ 
float curSpeed = Time.deltaTime * speed; 

localRotation.y += Input.acceleration.x * curSpeed; 
localRotation.x += Input.acceleration.y * curSpeed; 

transform.rotation = localRotation; 
} 

für gamedev q & a: stackexchange gamedev

+0

Danke, aber es funktioniert nicht. –

1

Sie müssen smooth die Beschleunigungsmesserdaten, bevor es zu benutzen. Andernfalls wird die GameObect beim Neigen des Geräts zittern oder laut werden.

Sie müssen nur den Beschleunigungsmesser Wert in Quaternion mit Quaternion.Euler konvertieren dann den Wert direkt zuweisen transform.localRotation des GameObect.

int MIN = 0; 
int MAX = 100; 
public bool flipDirection = false; 
public bool smoothAccelerometer = true; 

float defaultZValue; 

//Filter Accelerometer 
float AccelerometerUpdateInterval = 1.0f/30.0f; 
float LowPassKernelWidthInSeconds = 1.0f; 
float LowPassFilterFactor = 0; 
Vector3 lowPassValue = Vector3.zero; 

void Start() 
{ 
    defaultZValue = transform.position.z; 

    //Filter Accelerometer 
    LowPassFilterFactor = AccelerometerUpdateInterval/LowPassKernelWidthInSeconds; 
    lowPassValue = Input.acceleration; 
} 


void Update() 
{ 
    //Move Object 
    transform.Translate(Vector3.forward * Time.deltaTime); 

    //Get smoothed Accelerometer value values (pass in false to use raw Accelerometer values) 
    Vector3 dir = LowPassFilterAccelerometer(smoothAccelerometer); 

    if (Input.deviceOrientation == DeviceOrientation.LandscapeLeft || Input.deviceOrientation == DeviceOrientation.LandscapeRight) 
    { 
     //Check if right 
     if (dir.x > 0) 
     { 
      float angle = mapValue(dir.x, 0f, 1f, MIN, MAX); 
      if (flipDirection) 
      { 
       angle = angle * -1; 
      } 
      transform.localRotation = Quaternion.Euler(0, 0, angle); 
     } 
     //Check if left 
     else if (dir.x < 0) 
     { 
      float angle = mapValue(dir.x, -0f, -1f, -MIN, -MAX); 
      if (flipDirection) 
      { 
       angle = angle * -1; 
      } 
      transform.localRotation = Quaternion.Euler(0, 0, angle); 
     } 
     //Middle(No direction) 
     else 
     { 
      //Use Default Angle 
      transform.localRotation = Quaternion.Euler(0, 0, defaultZValue); 
     } 
    } 
} 

float mapValue(float mainValue, float inValueMin, float inValueMax, float outValueMin, float outValueMax) 
{ 
    return (mainValue - inValueMin) * (outValueMax - outValueMin)/(inValueMax - inValueMin) + outValueMin; 
} 

//Filter Accelerometer 
Vector3 LowPassFilterAccelerometer(bool smooth) 
{ 
    if (smooth) 
     lowPassValue = Vector3.Lerp(lowPassValue, Input.acceleration, LowPassFilterFactor); 
    else 
     lowPassValue = Input.acceleration; 

    return lowPassValue; 
} 
+0

** Hinweis **: Wenn es nicht funktioniert, sagen Sie, was nicht funktioniert. Sag nicht, dass es nicht funktioniert. Das ist nicht hilfreich für mich. – Programmer

+0

Sorry für die späte.Yea Ich habe es überprüft und es ist nicht kippen. –