2012-07-02 200 views
2

好吧,即时通讯新的JavaScript和统一,所以这显然是一个很noob初学者的问题。 基本上我创建了一个脚本,我放在我的相机。然后,当我在游戏中选择一个模型时,它会成为相机脚本的目标,并试图让相机顺利转向它。下面是即时通讯平滑相机旋转

在更新函数中我使用raycast捕捉单元的鼠标单击。这成为脚本中的目标变量。它将bool设置为true,然后在moveto函数中跟随目标。但它似乎只是移动相机,如果我保持鼠标左键按下单位。我试图选择一个单位,然后让相机顺利旋转到单位。 关于这个菜鸟错误的任何想法?

#pragma strict 
var speed = 5.0; 
var freeMovementTurnSpeed = 10.0; 
var freeMovementForwardSpeed = 10.0; 
var freeMovementVerticalSpeed = 10.0; 
var maxHeight = 30; 
var minHeight = 2; 

var target : Transform; 

var distance = 10.0; 

var maxDistance = 50; 
var minDistance = 10; 

var xSpeed = 250.0; 
var ySpeed = 120.0; 

var yMinLimit = -20; 
var yMaxLimit = 80; 

private var x = 0.0; 
private var y = 0.0; 

// The distance in the x-z plane to the target 
var followDistance = 30.0; 
var maxDistanceDelta = 0.2; 
var damping = 3.0; 
var followTarget = false; 
var smoothRotation ; 
function Start() { 
    var angles = transform.eulerAngles; 
    x = angles.y; 
    y = angles.x; 

    if(target){ 
     transform.LookAt(target); 
    } 
    // Make the rigid body not change rotation 
    if (rigidbody) 
     rigidbody.freezeRotation = true; 
} 

function LateUpdate() { 
    if(target){ 
     if(followTarget){ 
      moveTo(); 
     } 
     else{ 
      targetSelectedMovement(); 
     } 
    } 
    else { 
     freeMovement(); 
    } 


} 

function moveTo(){ 

    //transform.LookAt (target); 

    var currentDistance = Vector3.Distance(transform.position,target.position); 

    //if (currentDistance<40){ 
     //followTarget = false; 
    //} 
    //else{ 

     smoothRotation = Quaternion.LookRotation(target.position - transform.position); 
     transform.rotation = Quaternion.Slerp(transform.rotation, smoothRotation, Time.deltaTime * damping); 
     print(target); 
     //transform.position = Vector3.MoveTowards(transform.position,target.position,maxDistanceDelta); 
    //} 

} 

function freeMovement(){ 
    var zPos = Input.GetAxis("Vertical") * Time.deltaTime * freeMovementForwardSpeed; 
    var xPos = Input.GetAxis("Horizontal") * Time.deltaTime * freeMovementTurnSpeed; 
    var strafePos = Input.GetAxis("Strafe")* Time.deltaTime * freeMovementForwardSpeed; 
    var vertPos = Input.GetAxis("GainVertical")* Time.deltaTime * freeMovementVerticalSpeed; 

    if (Input.GetButton("Fire2")) { 
     x += Input.GetAxis("Mouse X") * xSpeed * 0.02; 
     y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02; 

     y = ClampAngle(y, yMinLimit, yMaxLimit); 

     var rotation2 = Quaternion.Euler(y, x, 0); 
     transform.rotation = rotation2; 
    } 
    else { 
     transform.Rotate(0, Input.GetAxis("Horizontal")*freeMovementTurnSpeed*Time.deltaTime, 0,Space.World); 
    } 
    if (vertPos > 0 && transform.position.y > maxHeight){ 
     vertPos = 0; 
    } 
    else if(vertPos < 0 && transform.position.y < minHeight){ 
     vertPos = 0; 
    } 

    print(transform.position.y); 
    transform.Translate(strafePos,vertPos,zPos); 

} 
function targetSelectedMovement() { 
    if(Input.GetKey("a") || Input.GetKey("d")){ 

     x += (-Input.GetAxis("Horizontal")) * xSpeed * 0.02; 
     var rotation = Quaternion.Euler(y, x, 0); 
     var currentDistance = Vector3.Distance(transform.position,target.position); 

     var position = rotation * Vector3(0.0, 0.0, -currentDistance) + target.position; 

     transform.rotation = rotation; 
     transform.position = position; 
    } 

    var zPos = Input.GetAxis("Vertical") * Time.deltaTime * speed; 
    currentDistance = Vector3.Distance(transform.position,target.position); 
    if(currentDistance < maxDistance && zPos < 0){ 
     transform.Translate(0, 0, zPos); 
    } 
    else if(currentDistance > minDistance && zPos > 0){ 
     transform.Translate(0, 0, zPos); 
    } 
    if (Input.GetButton("Fire2")) { 
     x += Input.GetAxis("Mouse X") * xSpeed * 0.02; 
     y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02; 

     y = ClampAngle(y, yMinLimit, yMaxLimit); 

     var rotation2 = Quaternion.Euler(y, x, 0); 
     var currentDistance2 = Vector3.Distance(transform.position,target.position); 

     var position2 = rotation2 * Vector3(0.0, 0.0, -currentDistance2) + target.position; 

     transform.rotation = rotation2; 
     transform.position = position2; 
    } 
} 

static function ClampAngle (angle : float, min : float, max : float) { 
    if (angle < -360) 
     angle += 360; 
    if (angle > 360) 
     angle -= 360; 
    return Mathf.Clamp (angle, min, max); 
} 

function Update() { 

    var hit : RaycastHit; 

    if (Input.GetButton("Fire1")) { 

     var ray : Ray = Camera.main.ScreenPointToRay (Input.mousePosition); 
     // Cast a ray forward from our position for the specified distance 
     if (Physics.Raycast(ray, hit)) 
     { 
      // Add a specified force to the Rigidbody component to the other GameObject 
      if(hit.collider.tag == "Unit"){ 
       print("Selected " + hit.collider.gameObject.name); 
       target = hit.collider.gameObject.transform; 
       //transform.LookAt(target); 
       followTarget = true; 
      } 
      else { 
       target = null; 
      } 

     } 

    } 

} 
+0

是否可以看到整个脚本?你看起来很好,我测试了它,按照广告的方式工作。 – Jerdak

+0

是的,我只是链接完整的脚本。如果这有助于让我知道因为我失去了 – glogic

+0

我得看看我什么时候开始我的开发。但同时尝试用Input.GetButtonDown(“Fire1”)替换Input.GetButton(“Fire1”)。就像测试一样,因为看着你的代码,没有什么会跳到我身上。只要按钮处于保持状态,GetButton就是true,在过去,我们遇到了错误触发问题,就像鼠标移出对象一样。 – Jerdak

回答

2

:)

回答我的意见拉到上面:

“我得看看,当我得到我的开发机器上,但在平均时间尝试更换Input.GetButton(。 “Fire1”)与Input.GetButtonDown(“Fire1”)。就像一个测试,因为看你的代码没有任何东西跳出来。GetButton是真实的,只要按钮被保留,在过去,我有问题不正确地触发,就像鼠标移出物体一样。“