2015-04-13 3 views
0

Теперь у меня возникло много проблем с этим, и я использовал базовый код Unity, который они предоставляют как часть их пакета 2D-активов, и можно увидеть ниже: : с использованием UnityEngine; с использованием System.Collections;Unity Camera Следуйте за 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; 
    } 
} 
} 

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

+0

Вы пытались использовать iTween? Я поставил сценарии iTween на камеру, и это помогает заикаться. – ApolloSoftware

ответ

1

Нет абсолютно никакой необходимости в том, чтобы найти игрока (target) внутри update(). Я предполагаю, что GameObject за игроком останется таким же, поэтому найдите игрока один раз в методе Start().

Я не уверен, является ли это причиной вашей проблемы. Вы можете опробовать временно, установив абсолютное значение 0.5f внутри FindPlayer() в 0.02f или sth. Это будет чаще обновлять цель. Если это помогает, это потому, что вы обновляете реальную целевую позицию только два раза в секунду.

+0

Как только цель была назначена, функция, на которую вы ссылаетесь, не будет называться так, это не причина того, что вещь заикается. –

0

Если вы не определяете порядок, в котором происходит сценарий камеры и движение вашей цели, ваша камера может быть рамкой за действием, что вызывает заикание.

Смените сценарий вашей камеры на: LateUpdate() - если вы перемещаете цель самостоятельно. FixedUpdate() - если цель - Жесткое тело, двинутое Физикой.

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