Unity3d 平滑摄影机旋转

Unity3d 平滑摄影机旋转,unity3d,unityscript,Unity3d,Unityscript,好吧,我是javascript和Unity的新手,所以这显然是一个非常noob初学者的问题。 基本上,我已经创建了一个脚本,我把它放在我的相机上。然后,当我在游戏中选择一个模型时,它就成为了摄影机脚本的目标,我试图让摄影机平稳地转向它。下面是我正在尝试的 在更新函数中,我使用raycast捕捉鼠标单击的单位。这将成为脚本中的目标变量。它将bool设置为true,然后在moveto函数中跟随目标。但它似乎只有在我按住鼠标左键的情况下才能移动相机。我试图选择一个单位,然后让相机顺利地旋转到单位。 对

好吧,我是javascript和Unity的新手,所以这显然是一个非常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;
            }

        }

    }

}
#pragma strict
无功转速=5.0;
var freeMovementTurnSpeed=10.0;
var freeMovementForwardSpeed=10.0;
var freeMovementVerticalSpeed=10.0;
var maxHeight=30;
var-minHeight=2;
var目标:转换;
var距离=10.0;
var maxDistance=50;
var-minDistance=10;
var xSpeed=250.0;
var ySpeed=120.0;
var yMinLimit=-20;
var yMaxLimit=80;
私人var x=0.0;
私人变量y=0.0;
//x-z平面到目标的距离
var followDistance=30.0;
var maxDistanceDelta=0.2;
无功阻尼=3.0;
var followTarget=false;
var平滑旋转;
函数启动(){
变量角度=transform.eulerAngles;
x=角度y;
y=角度x;
如果(目标){
变换。注视(目标);
}
//使刚体不改变旋转
if(刚体)
刚体旋转=真;
}
函数更新(){
如果(目标){
if(followTarget){
moveTo();
}
否则{
targetSelectedMovement();
}
}
否则{
自由移动();
}
}
函数moveTo(){
//transform.LookAt(目标);
var currentDistance=Vector3.距离(变换位置、目标位置);
//if(当前距离0&&transform.position.y>maxHeight){
垂直位置=0;
}
else if(顶点位置<0&&transform.position.yMindDistance&&zPos>0){
transform.Translate(0,0,zPos);
}
if(Input.GetButton(“Fire2”)){
x+=Input.GetAxis(“鼠标x”)*xSpeed*0.02;
y-=Input.GetAxis(“鼠标y”)*ySpeed*0.02;
y=抓斗(y,yMinLimit,yMaxLimit);
var rotation2=四元数Euler(y,x,0);
var currentDistance2=向量3.距离(变换位置、目标位置);
变量位置2=旋转2*矢量3(0.0,0.0,-当前距离2)+目标位置;
transform.rotation=rotation2;
transform.position=position2;
}
}
静态功能夹持器(角度:浮动,最小:浮动,最大:浮动){
如果(角度<-360)
角度+=360;
如果(角度>360)
角度-=360;
返回数学夹具(角度、最小值、最大值);
}
函数更新(){
var-hit:RaycastHit;
if(Input.GetButton(“Fire1”)){
var-ray:ray=Camera.main.screenpointoray(Input.mousePosition);
//从我们的位置向前投射一道光线,距离指定
if(物理光线投射(光线,命中))
{
//向其他游戏对象的刚体组件添加指定的力
if(hit.collider.tag==“单位”){
打印(“选定”+命中.碰撞器.游戏对象.名称);
target=hit.collider.gameObject.transform;
//变换。注视(目标);
followTarget=true;
}
否则{
target=null;
}
}
}
}
:)

答案来自我上面的评论:


“当我进入开发机器时,我必须查看一下,但同时尝试用Input.GetButton(“Fire1”)替换Input.GetButton(“Fire1”)。作为测试,因为查看您的代码时,没有任何东西会从我身上跳出来。只要按住按钮,GetButton就是正确的。过去,当鼠标从对象上移开时,我曾遇到错误触发GetButton的问题。“

是否可以看到整个脚本?你的看起来不错,我测试过了,效果和广告一样。是的,我刚刚链接了完整的脚本。如果这有助于让我知道,因为当我进入开发机器时,我将不得不查看,但同时尝试用Input.GetButton(“Fire1”)替换Input.GetButton(“Fire1”)。作为一个测试,因为看着你的代码,我什么都看不出来。只要按住按钮,GetButton就是正确的。在过去,当鼠标离开某个对象时,我就遇到过错误触发的问题。你我的朋友是个天才!!很难相信这就是问题所在!哇!非常感谢我为那件事发疯。我仍然不确定为什么它不能以另一种方式工作。无论如何,我会欣然接受你的答案:)