Unity3d 平滑摄影机旋转
好吧,我是javascript和Unity的新手,所以这显然是一个非常noob初学者的问题。 基本上,我已经创建了一个脚本,我把它放在我的相机上。然后,当我在游戏中选择一个模型时,它就成为了摄影机脚本的目标,我试图让摄影机平稳地转向它。下面是我正在尝试的 在更新函数中,我使用raycast捕捉鼠标单击的单位。这将成为脚本中的目标变量。它将bool设置为true,然后在moveto函数中跟随目标。但它似乎只有在我按住鼠标左键的情况下才能移动相机。我试图选择一个单位,然后让相机顺利地旋转到单位。 对这个新手的错误有什么想法吗Unity3d 平滑摄影机旋转,unity3d,unityscript,Unity3d,Unityscript,好吧,我是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就是正确的。在过去,当鼠标离开某个对象时,我就遇到过错误触发的问题。你我的朋友是个天才!!很难相信这就是问题所在!哇!非常感谢我为那件事发疯。我仍然不确定为什么它不能以另一种方式工作。无论如何,我会欣然接受你的答案:)