- 最后登录
- 2014-10-23
- 注册时间
- 2011-7-19
- 阅读权限
- 90
- 积分
- 81303
 
- 纳金币
- -1
- 精华
- 11
|
挺喜欢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 |
|