Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.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# Mega man 2摄像头帮助(Unity)_C#_Unity3d - Fatal编程技术网

C# Mega man 2摄像头帮助(Unity)

C# Mega man 2摄像头帮助(Unity),c#,unity3d,C#,Unity3d,因此,我尝试了几种方法来修复Mega man 2摄像头,但实际上没有找到一种好方法。所以,如果有人能给我一些建议,让我解决这个问题,我会很高兴的 问题:正如我所写的,我想要一个Mega man 2摄像头(2D)。我还没能从中解决的问题是如何在Y中移动它,就像在Mega man 2中一样。发生的情况是,摄影机在Y轴上根本不移动,除非您超出“摄影机边界”,然后它“冻结”播放器并向下移动摄影机,请参见此视频:(希望从摄影机移动的位置开始,否则转到5:02) 但我不能让它对我有任何好处。到目前为止,我一

因此,我尝试了几种方法来修复Mega man 2摄像头,但实际上没有找到一种好方法。所以,如果有人能给我一些建议,让我解决这个问题,我会很高兴的

问题:正如我所写的,我想要一个Mega man 2摄像头(2D)。我还没能从中解决的问题是如何在Y中移动它,就像在Mega man 2中一样。发生的情况是,摄影机在Y轴上根本不移动,除非您超出“摄影机边界”,然后它“冻结”播放器并向下移动摄影机,请参见此视频:(希望从摄影机移动的位置开始,否则转到5:02)

但我不能让它对我有任何好处。到目前为止,我一直在尝试的是,我在相机的顶部和底部都有触发器,当玩家击中其中一个时,我会启动一个协同程序,在这个程序中,相机应该是Lerp的,但是,它移动太多了,所以如果我需要在Y中移动它两次,它就会被搞砸。(我的代码在底部,但正如我所说的,我需要一些帮助如何修复它)

所以,如果有人知道我如何解决这个问题,请告诉我。我已经试了好几天,但都没能使它完全发挥作用

    public void ChangeY()
 {
     StartCoroutine(MoveCameraDown());
 }

 IEnumerator MoveCameraDown()
 {
     Vector3 CurrentCameraPos = Camera.main.transform.position;
     Vector3 NewCameraPos = new Vector3(Camera.main.transform.position.x, Camera.main.transform.position.y - 5.6f, Camera.main.transform.position.z);

     for (float t = 0.0f; t < 1; t += Time.deltaTime / 1.5f /* TIME IT SHOULD TAKE TO MOVE THE CAMERA DOWN */)
     {
         Camera.main.transform.position = Vector3.Lerp(CurrentCameraPos, NewCameraPos, t);
         yield return null;
     }
 }
public void ChangeY()
{
Start例程(MoveCameraDown());
}
IEnumerator MoveCameraDown()
{
Vector3 CurrentCameraPos=Camera.main.transform.position;
Vector3 NewCameraPos=newvector3(Camera.main.transform.position.x,Camera.main.transform.position.y-5.6f,Camera.main.transform.position.z);
对于(浮动t=0.0f;t<1;t+=Time.deltaTime/1.5f/*向下移动相机所需的时间*)
{
Camera.main.transform.position=Vector3.Lerp(CurrentCameraPos,NewCameraPos,t);
收益返回空;
}
}

正如我已经写的,当我点击其中一个触发器时,我调用ChangeY()。如果您想知道为什么有些数字是硬编码的,那么这只是我的测试用例。但正如我所说,我还没能解决这个问题,所以如果有人能帮助我,我将非常感激。

这其实很容易做到。你问我一些建议,我会给你的。 假设你已经建立了2D世界,就像你发布的视频一样。有很多方法来解决这个问题,但我告诉你的方式,我认为是最容易的。我有5个步骤供你遵循

您需要一个每次向下移动时都可以使用的值。根据您的代码,您每次使用-5.6f。每次玩家触底触发器时,下降值不应相同。它应该在运行时生成。 这将在步骤3中解决

1)如果玩家触发相机底部触发器,首先要做的是停止玩家,方法是禁用重力,然后将刚体速度扭矩设置为。 例如,在连接到相机的OnTiggerEnter函数中:

 void OnTriggerEnter(Collider other) {
    Rigidbody rgbd;
    rgbd= other.gameObject.GetComponent<Rigidbody> ();
    rgbd.useGravity = false;
    rgbd.velocity = Vector3.zero;
    rgbd.angularVelocity = Vector3.zero;
    }
播放机下方对象的信息将存储在RaycastHit中。 使用RaycastHit获取玩家即将着陆的物体的相关信息

3)在获得玩家即将着陆的对象的信息后,获取该对象的y轴位置,然后获取玩家的y轴位置将它们相加,然后将结果除以2。那是你的新位置。您需要将相机移动到的新位置。比如说,

    GameObject gameOBjectHitFromRaycast;//Store Game Object detected from the raycast
    RaycastHit hit;
    if (Physics.Raycast(player.transform.position, Vector3.down, out hit)){
           gameOBjectHitFromRaycast = hit.collider.gameObject;     
    }
Vector3 cameraNewPos = new Vector3(player.transform.position.x,(gameOBjectHitFromRaycast.transform.position.y+
camera.transform.position.y)/2,player.transform.position.z);
基本上,我们在这里做的是找到球员的当前位置和着陆位置的中间位置,这样我们就可以把摄像机放在中间。应该这样做,但如果这还不够的话,你也可以从y轴上减去另一个数字

4)使用coroutine功能将相机平滑移动到新y轴位置。在corutine函数内部,应该有一个公共bool变量,用于确定该函数是否在运行(如果摄影机在移动)。 将此功能替换为当前的相机移动功能

bool cameraMoving = false; //This variable can be used to determine when the camera is done moving

private IEnumerator MoveCameraDown (Vector3 toLocationPos, float timeToFinish)
{
    float runTime = 0; //Dont change
    float timer = 0;  //Dont change
    float tempDeltaTime;

    cameraMoving = true;

    //Will keep looping until camera is done moving
    while (timer<timeToFinish) {
        //Translate camera
        Camera.main.transform.position = Vector3.Lerp (Camera.main.transform.position, toLocationPos, runTime);

        tempDeltaTime = Time.deltaTime; //Get delta time once to be used multiple times to improve performance
        runTime += tempDeltaTime / timeToFinish;
        timer += tempDeltaTime; //Increement To exit loop
        yield return null;
    }

    //Camera is done moving
    cameraMoving = false;
}
5)当相机完成移动时,启用玩家的刚体重力

Rigidbody rgbd;
rgbd= player.GetComponent<Rigidbody> ();
rgbd.useGravity = true;
刚体rgbd;
rgbd=player.GetComponent();
rgbd.useGravity=true;

这可能更适合您,所以您现在的问题是相机移动太多,您需要一种时间传递方式,告诉它移动相机需要多长时间?是的,它移动得比我为相机设置的移动量更远。不知道为什么会这样。我也不确定这是解决我的相机上下移动问题的最好方法。所以,如果有更好的方法,我也愿意听你这么说。上床睡觉。如果这对您有帮助,请单击“接受”。通过提供的示例和提供给您的平滑移动摄像头功能,您在完成要求时应该不会遇到其他问题。太棒了,我一到家就会尝试。谢谢你的详细解释。谢谢!我似乎能使它发挥作用非常感谢你的帮助。
Rigidbody rgbd;
rgbd= player.GetComponent<Rigidbody> ();
rgbd.useGravity = true;