查看: 1391|回复: 0
打印 上一主题 下一主题

类似maya的摄像机操作脚本

[复制链接]

5552

主题

2

听众

8万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
11

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2012-6-7 16:14:51 |只看该作者 |倒序浏览
挺喜欢maya里的摄像机操作方式的,于是就用StandAssest里的脚本改了一个,然后加上了wsad的移动。
把这个脚本丢给摄像机,建立一个空物体作为摄像机的父物体并把这个物体丢在target上就可以了。
附上contralGuild

//Maya Style Camera Move
//24-10-10
varcontralGuild: Texture;
vartarget : Transform;
var distance = 20.0;
varenableAltKey=***e;
varenableFocus = false;

varxSpeed = 250.0;
varySpeed = 120.0;
varcameraMoveSpeed = 500;
varZoomSpeed = 500;
varminZoomDistance =0;
varmaxZoomDistance = 2000;

varyMinLimit = -20;
varyMaxLimit = 80;

varonMouseSelectColour= Color.green;

private var selectTarget: Transform;
private var currentSelectTarget: Transform;
private var originalColor : Color;
private var moveSpeed: float;
private var zoomSpeed: float;
private var x = 0.0;
private var y = 0.0;

@script AddComponentMenu("Camera-Control/Maya Style Camera Control")

function Start () {
    var angles = transform.eulerAngles;
    x = angles.y;
    y = angles.x;
                                
//make sure zoom speed and zoom distance are positive
    ZoomSpeed=Mathf.Abs(ZoomSpeed);
    maxZoomDistance=Mathf.Abs(maxZoomDistance);
    maxZoomDistance=Mathf.Clamp(maxZoomDistance,5,10000);
    minZoomDistance=Mathf.Clamp(minZoomDistance,0,maxZoomDistance-1);

    if (rigidbody)
         rigidbody.freezeRotation = ***e;
}

function Update(){
//selectTarget by left mouse button
//check if this function is used
      if(enableFocus){
         if(Input.GetKeyDown("mouse 0") && !Input.GetKey("left alt")){
//when left mouse button click, if there is a target at mouse point position, select it
//and deselect the previous target if there are
             if(selectTarget){
                   if(currentSelectTarget)
                        currentSelectTarget.renderer.material.color=originalColor;                             originalColor=selectTarget.renderer.material.color;
         selectTarget.renderer.material.color=onMouseSelectColour;
                    currentSelectTarget=selectTarget;
              }
              //else deselect the target
              else if(currentSelectTarget){
    currentSelectTarget.renderer.material.color=originalColor;
                      currentSelectTarget=null;
               }
        }
         //if f key pressed, focus to the select target
         if(Input.GetKeyDown("f")){
              FocusToSelectTarget();
         }
   }
                                
   var headUpDir=transform.TransformDirection(Vector3.forward);
   headUpDir.y=0;
   headUpDir=headUpDir.normalized;
   headUpDir*=Input.GetAxisRaw("Vertical")*40*Time.deltaTime;
    var leftHandSideDir=transform.TransformDirection(Vector3.left)*Input.GetAxisRaw("Horizontal")*(-40)*Time.deltaTime;
                                
   target.Translate(headUpDir+leftHandSideDir);

}

function LateUpdate () {
    if (target) {
//zoom and move speed are increased with the distance from camera to focus point
       zoomSpeed=distance*ZoomSpeed/maxZoomDistance+50;
       moveSpeed=distance*cameraMoveSpeed/maxZoomDistance+50;
                                 
       //check use alt key or not
      //if need use alt key to move camera, check if key is pressed
      //otherwise just move the camera form mouse inputs
       if(Input.GetKey("left alt") || !enableAltKey){
        //left mouse button is for rotate camera
               if(Input.GetKey("mouse 0")){
                     x += Input.GetAxis("Mouse X") * xSpeed * 0.02;
                     y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02;
                                
                     y = ClampAngle(y, yMinLimit, yMaxLimit);
               }
               //right mouse button is for zoom camera
               else if(Input.GetKey("mouse 1")){
                    distance-=Input.GetAxis("Mouse X")* zoomSpeed *0.02;
                    distance-=Input.GetAxis("Mouse Y")* zoomSpeed *0.02;
                }
                //middle mouse button is for move camera around
                else if(Input.GetKey("mouse 2")){
                     var leftHandSideMove=transform.TransformDirection(Vector3.left);
                     target.position+=(leftHandSideMove* moveSpeed *Input.GetAxisRaw("Mouse X") * 0.02);
                                               
                     target.position.y+=Input.GetAxisRaw("Mouse Y") * moveSpeed*0.02*(-1);
                 }
                  //make sure distance is positive and not too far
                 //calculate camera rotation and position
                                                                             
                 distance=Mathf.Clamp(distance,minZoomDistance,maxZoomDistance);
                                       
                 var rotation = Quaternion.Euler(y, x, 0);
                var position = rotation * Vector3(0.0, 0.0, -distance) + target.position;
      
                transform.rotation = rotation;
                 transform.position = position;
       }
        //if enable focus
        //find object at where mouse pointed
        if(enableFocus)
            SelectTarget();

    }
}

function OnGUI(){
GUI.DrawTexture(Rect(0,0,256,256),contralGuild);
}

function SelectTarget(){
    var ray = Camera.main.ScreenPointToRay (Input.mousePosition);
    var hit : RaycastHit;
                                
    if (Physics.Raycast (ray, hit, 1000)){
    Debug.DrawLine(ray.origin,hit.point);
    selectTarget=hit.transform;
    }
    else
        selectTarget=null;
}

function FocusToSelectTarget(){
     if(currentSelectTarget){
         target.position=currentSelectTarget.position;
          distance=Mathf.Clamp(distance,1,200);
     }
}

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);
转自:http://blog.sina.com.cn/s/blog_4a2183a60100niq4.html
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2025-6-16 09:37 , Processed in 0.067735 second(s), 28 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部