光滑的相机旋转

时间:2012-07-02 21:17:58

标签: unity3d unityscript

好的我是javascript和Unity的新手,所以这显然是一个非常棒的初学者问题。 基本上我已经创建了一个放在相机上的脚本。然后,当我在游戏中选择一个模型时,它就成了相机脚本的目标,我试图让相机顺利转向它。以下是我正在尝试的

在更新功能中,我使用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;
            }

        }

    }

}

1 个答案:

答案 0 :(得分:2)

:)

从我上面的评论中提取答案:

“当我上机器时,我必须看看,但同时尝试用Input.GetButtonDown(”Fire1“)替换Input.GetButton(”Fire1“)。就像测试一样,因为看在你的代码中没有任何东西跳出来。只要按钮被保持,GetButton就是真的,过去我遇到了问题,就像鼠标移出一个物体一样错误地触发它。“