2015-04-13 1 views
0

Maintenant, j'ai eu beaucoup de problèmes avec ceci, et j'ai utilisé le code Unity de base qu'ils fournissent dans le cadre de leur pack d'actifs 2D, et peut être vu comme suit ci-dessous : en utilisant UnityEngine; en utilisant System.Collections;Unity Camera Suivre le bégaiement 2D

public class Camera2DFollow : MonoBehaviour { 

public Transform target; 
public float damping = 1; 
public float lookAheadFactor = 3; 
public float lookAheadReturnSpeed = 0.5f; 
public float lookAheadMoveThreshold = 0.1f; 
public float yPosRestriction = -1; 

float offsetZ; 
Vector3 lastTargetPosition; 
Vector3 currentVelocity; 
Vector3 lookAheadPos; 

float nextTimeToSearch = 0; 

// Use this for initialization 
void Start() { 
    lastTargetPosition = target.position; 
    offsetZ = (transform.position - target.position).z; 
    transform.parent = null; 
} 

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

    if (target == null) { 
     FindPlayer(); 
     return; 
    } 

    // only update lookahead pos if accelerating or changed direction 
    float xMoveDelta = (target.position - lastTargetPosition).x; 

    bool updateLookAheadTarget = Mathf.Abs(xMoveDelta) > lookAheadMoveThreshold; 

    if (updateLookAheadTarget) { 
     lookAheadPos = lookAheadFactor * Vector3.right * Mathf.Sign(xMoveDelta); 
    } else { 
     lookAheadPos = Vector3.MoveTowards(lookAheadPos, Vector3.zero, Time.deltaTime * lookAheadReturnSpeed); 
    } 

    Vector3 aheadTargetPos = target.position + lookAheadPos + Vector3.forward * offsetZ; 
    Vector3 newPos = Vector3.SmoothDamp(transform.position, aheadTargetPos, ref currentVelocity, damping); 

    newPos = new Vector3 (newPos.x, Mathf.Clamp (newPos.y, yPosRestriction, Mathf.Infinity), newPos.z); 

    transform.position = newPos; 

    lastTargetPosition = target.position;  
} 

void FindPlayer() { 
    if (nextTimeToSearch <= Time.time) { 
     GameObject searchResult = GameObject.FindGameObjectWithTag ("Player"); 
     if (searchResult != null) 
      target = searchResult.transform; 
     nextTimeToSearch = Time.time + 0.5f; 
    } 
} 
} 

L'une des principales raisons pour lesquelles j'ai eu des problèmes avec c'est parce que je suis tout à fait nouveau à l'unité et ont vraiment touché que sur UnityScript, mais mon principal problème est que la fusée augmente la vitesse de mon jeu , la caméra commence à bégayer, j'ai l'impression que c'est quelque chose à voir avec l'amortissement?

+0

Avez-vous essayé d'utiliser iTween? J'ai placé des scripts iTween sur la caméra et cela aide le bégaiement. – ApolloSoftware

Répondre

1

Il n'est absolument pas nécessaire de trouver le lecteur (target) à l'intérieur update(). Je suppose que le GameObject derrière le joueur restera le même, alors trouvez le joueur une fois dans la méthode Start().

Je ne suis pas sûr si c'est la raison de votre problème. Vous pouvez essayer temporairement en définissant la valeur absolue de 0.5f à l'intérieur de FindPlayer() à 0.02f ou sth. Cela mettra à jour la cible plus souvent. Si cela vous aide, c'est parce que vous mettez à jour la position cible réelle seulement deux fois par seconde.

+0

Une fois que la cible a été assignée, la fonction à laquelle vous faites référence ne sera pas appelée ainsi, ce n'est pas la raison pour laquelle cette chose bégaie. –

0

Si vous ne définissez pas l'ordre dans lequel votre script de caméra et le mouvement de votre cible se produisent, votre caméra peut être un cadre derrière l'action, ce qui provoque le bégaiement.

Modifiez le script de votre caméra sur: LateUpdate() - si vous déplacez la cible vous-même. FixedUpdate() - si la cible est un corps rigide déplacé par la physique.