2

JavaScriptとUnityは初めてなので、これは明らかに初心者向けの質問です。基本的に、カメラに配置するスクリプトを作成しました。次に、ゲームでモデルを選択すると、それがカメラスクリプトのターゲットになり、カメラをスムーズに回転させようとします。以下は私が試していることです

更新機能では、レイキャストを使用してマウスクリックでユニットをキャッチします。これがスクリプトのターゲット変数になります。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;
            }

        }

    }

}
4

1 に答える 1

2

:)

上記の私のコメントから引き出された答え:

「開発マシンに乗ったときに確認する必要がありますが、それまでの間、Input.GetButton( "Fire1")をInput.GetButtonDown( "Fire1")に置き換えてみてください。コードを確認するため、テストと同じです。ボタンが押されている限り、GetButtonはtrueです。これまで、マウスがオブジェクトから離れたときに誤ってトリガーされるという問題がありました。」

于 2012-07-03T20:14:54.760 に答える