unity3d:如何让SpotLight跟随一个对象?

时间:2013-01-07 11:00:09

标签: object rotation unity3d light

我正在使对象移动它的update()并根据用户输入向左向上转。我想要的只是让聚光灯跟随对象。 对象的旋转:0,180,0 SpotLight的轮换:90,0,0 由于旋转不同(并且它们需要像那样),我无法使光跟随物体。 代码:

function Update () {

    SetControl(); // Input Stuff... 

    transform.Translate (0, 0, objectSpeed*Time.deltaTime);

    lightView.transform.eulerAngles=this.transform.eulerAngles;
    lightView.transform.Rotate=this.transform.eulerAngles;
    lightView.transform.Translate(snakeSpeed*Time.deltaTime,0, 0);  //THIS IS INCORRECT

}

lightView只是指向SpotLight。

2 个答案:

答案 0 :(得分:3)

您正在寻找的是Unity方法Transform.lookAt

将以下脚本置于聚光灯下。此代码将使其附加的对象,查看另一个对象。

// Drag another object onto it to make the camera look at it.
var target : Transform; 

// Rotate the camera every frame so it keeps looking at the target 
function Update() {
    transform.LookAt(target);
}

答案 1 :(得分:1)

  

我想要的只是让聚光灯跟随对象。

这是一个两步过程。首先,找到目标的坐标位置(以世界坐标表示)。其次,将该位置加上偏移量应用于您的聚光灯。由于你的光线沿着x轴旋转了90°,我认为你的光线在上方并向下看。

var offset = new Vector3(0, 5, 0);

function Update()
{
  // Move this object
  transform.Translate (0, 0, objectSpeed*Time.deltaTime);

  // Move the light to transform's position + offset.
  // Note that the light's rotation has already been set and does
  //  not need to be re-set each frame.
  lightView.transform.position = transform.position + offset;
}

如果您想要更顺畅的“跟随”动作,请随时间进行线性插值。取代

lightView.transform.position = transform.position + offset;

lightView.transform.position = Vector3.Lerp(lightView.transform.position, transform.position + offset, Time.deltaTime * smoothingFactor);

其中smoothingFactor是任何浮动。

顺便说一句,在任何类型的循环游戏循环中调用transform.*都已接近死亡,因为GameObject.transform实际上是一个进行组件搜索的get属性。大多数Unity文档建议您先缓存转换变量。

更好的代码:

var myTrans = transform;    // Cache the transform
var lightTrans = lightView.transform;
var offset = new Vector3(0, 5, 0);

function Update()
{
  // Move this object
  myTrans.Translate (0, 0, objectSpeed*Time.deltaTime);

  // Move the light to transform's position + offset.
  // Note that the light's rotation has already been set and does
  //  not need to be re-set each frame.
  lightTrans.position = myTrans.position + offset;
}