Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 摄像机行为_C#_Unity3d_Camera - Fatal编程技术网

C# 摄像机行为

C# 摄像机行为,c#,unity3d,camera,C#,Unity3d,Camera,此摄影机脚本旨在旋转和观察正在移动的播放器,并在未移动时缓慢捕捉播放器。(玩家在向量3开始移动之前先经过向量3)。我的问题是我想慢慢地“填充”deltaPosition,这样它就不是突然的捕捉,而是一个缓慢而平滑的过渡,如果到达也停止添加 private void LateUpdate() { if (player.isMoving) { desiredPosition = player.beforeMoving + offset; } e

此摄影机脚本旨在旋转和观察正在移动的播放器,并在未移动时缓慢捕捉播放器。(玩家在向量3开始移动之前先经过向量3)。我的问题是我想慢慢地“填充”deltaPosition,这样它就不是突然的捕捉,而是一个缓慢而平滑的过渡,如果到达也停止添加

    private void LateUpdate()
{
    if (player.isMoving)
    {
        desiredPosition = player.beforeMoving + offset;
    }
    else
    {
        Vector3 deltaPosition = player.transform.position - player.beforeMoving; 
        desiredPosition += deltaPosition * Time.deltaTime;
    }
    Quaternion camTurnAngle =
    Quaternion.AngleAxis(input * rotationSpeed, Vector3.up);
    desiredPosition = camTurnAngle * desiredPosition;
    transform.position = Vector3.Slerp(transform.position, desiredPosition, smoothFactor);
    transform.LookAt(player.transform);
}
编辑:我想我会分享最后的代码

    private void LateUpdate()
{
    Quaternion rotation = Quaternion.Euler(GetDegree(), input.x * rotationSpeed, 0f);
    if (player.isMoving)
    {
        desiredPosition = player.beforeMoving + offset;
        CalculatePanTime();
    }
    else if (!player.isMoving)
    {
        desiredPosition = player.transform.position + offset;
    }
    transform.position = Vector3.Slerp(transform.position, rotation * desiredPosition, GetSpeed());
    transform.LookAt(player.transform);
}

private void CalculatePanTime()
{
    stoppedTime = Time.time;
    playerDelta = Vector3.Distance(player.transform.position, player.beforeMoving);
    timeToPan = (playerDelta / snappingSpeed) * Time.deltaTime;
}

private float GetSpeed()
{
    if (Time.time < stoppedTime + timeToPan)
    {
        controlsDisabled = true; return snappingSpeed;
    }
    else
    {
        controlsDisabled = false; return smoothSpeed;
    }
}
private void LateUpdate()
{
四元数旋转=四元数.Euler(GetDegree(),输入.x*旋转速度,0f);
if(player.isMoving)
{
desiredPosition=玩家移动前+偏移量;
计算时间();
}
否则如果(!player.isMoving)
{
desiredPosition=player.transform.position+偏移量;
}
transform.position=Vector3.Slerp(transform.position,rotation*desiredPosition,GetSpeed());
变换。看(player.transform);
}
私有void CalculatePanTime()
{
stoppedTime=Time.Time;
playerDelta=Vector3.距离(player.transform.position,player.beforeMoving);
timeToPan=(playerDelta/捕捉速度)*Time.deltaTime;
}
私有浮点GetSpeed()
{
如果(Time.Time
您正在告诉我们您希望代码做什么,这很好。您还发布了为实现目标而实现的代码,这也很好。您能否告诉我们,由于该代码,哪些部分无法正常工作

据我所知,它是“Vector3 deltaPosition=player.transform.position-player.beforeMoving; desiredPosition+=deltaPosition*Time.deltaTime;“这不是您期望的行为

也许可以试试这样:

private void LateUpdate()
{
    // snap the rotation center slowly to the player's position if not moving, or player's position before he started moving
    desiredPosition = Vector3.Lerp(desiredPosition, player.beforeMoving, 0.1f);

    // rotate around rotation center
    Quaternion camTurnAngle = Quaternion.AngleAxis(rotationSpeed * Time.time, Vector3.up);      
    desiredPosition += camTurnAngle * offset;

    // set the position to rotate around rotation center, and look towards player
    transform.position = Vector3.Lerp(transform.position, desiredPosition, smoothFactor);
    transform.LookAt(player.transform);
}
您的代码的问题是您的代码超出了预期。如果要实现决定相机捕捉速度或捕捉所需时间的功能,请尝试引入float player.timeStopMoving=time.time,您可以使用它在他不移动时正确计算位置校正

if(player.isMoving)
{
    desiredPosition = player.beforeMoving;
}
else
{
    const float timeNeededToSnap = 2f;
    // or float timeNeededToSnap = (player.transform.position - player.beforeMoving).magnitude; // (which you could compute only once in player script, when he stops moving, and then reuse the value instead of performing a ".magnitude" every frame)
    if(Time.time < player.timeStopMoving + timeNeededToSnap)
    {
        desiredPosition = Vector3.Lerp(desiredPosition, player.transform.position, (Time.time - player.timeStopMoving) / timeNeededToSnap);
    }
    else
    {
        // an other problem here is: if the player starts moving AGAIN before your desiredPosition got the value, do you want desired position to glich to the new player.beforeMoving?...
        desiredPosition = player.transform.position;
    }
}
if(player.isMoving)
{
desiredPosition=player.before移动;
}
其他的
{
const float timeneedtosnap=2f;
//或者float timeneedToSnap=(player.transform.position-player.beforeMoving).magnity;//(当玩家停止移动时,您只能在玩家脚本中计算一次,然后重用该值,而不是每帧执行一个.magnity)
如果(Time.Time
编辑:

要使lerp不那么线性,可以使用:

if(Time.time < player.timeStopMoving + timeNeededToSnap)
{
    var t = Mathf.Cos(Maths.Pi * 0.5f * (Time.time - player.timeStopMoving) / timeNeededToSnap); // as timeDelta/totalTime goes from 0->1, multiply it by Pi/2 and the Cos will also go from 0->1 but with a smoothing speed
    desiredPosition = Vector3.Lerp(desiredPosition, player.transform.position, t);
}
if(Time.Time1开始时,将其乘以Pi/2,Cos也将从0->1开始,但速度平滑
desiredPosition=Vector3.Lerp(desiredPosition,player.transform.position,t);
}

搬家前的计划是什么?很抱歉,你是对的。基本上,我希望我的相机根据播放器的位置有3种行为。(1)当播放器停止时,根据鼠标X围绕它旋转(距离是播放器的位置和初始偏移,我在开始时将其保存为变量)。(2) 如果它在移动,只需看着它,不要移动,(3)一旦它停止,慢慢地抓住它,然后切换到只是围绕它旋转。问题是捕捉速度总是太快,因为在单个帧中使用Vector3.Lerp覆盖所有距离。正如我所说:如果使用player.timeWhenStoppedMoving,可以控制捕捉速度。使用或math.Cos(Time.Time-player.timeWhenStoppedMoving)作为lerp中的t,您甚至可以使用停止的时间作为参考使快照以速度淡入淡出,这对我来说算是解决了一些问题,现在需要稍微调整一下,非常感谢。