Unity Error CS7036:没有给出与所需形式参数对应的参数

Unity Error CS7036: No argument given that corresponds to the required formal parameter

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class OblstacleMove : MonoBehaviour
{
    public GameObject Obstacle;
    public int velocidad;
    private int VelocidadRotacion;
    public 
    // Start is called before the first frame update
    void Start()
    {
        velocidad = 3;
    }
    // Update is called once per frame
    void Update()
    {
        if (gameObject.tag == "Vertical")
        {
            Obstacle.transform.Rotate(1, 0, 0, Space.Self);
        }
        if (gameObject.tag == "Horizontal")
        {
            Obstacle.transform.Rotate(0, 0, 1, Space.Self);
        }
        if(gameObject.tag == "Cube")
        {
            transform.Translate(new Vector2(velocidad * Time.deltaTime, 0));
            ChangeDirection();
        }

        //Obstacle.transform.Rotate(0, 0, 1, Space.Self);
    }

    public void ChangeDirection(Collision collision)
    {
        if(collision.gameObject.tag == "MapLimit")
        {
            velocidad = velocidad * -1;
        }
    }
}

我收到这个错误:

Assets\Scripts\OblstacleMove.cs(30,13):错误 CS7036:没有给定的参数对应于 'OblstacleMove.CambioDireccion(Collision)'

的必需形式参数 'collision'

我试过了

if(gameObject.tag == "Cube")
        {
            transform.Translate(new Vector2(velocidad * Time.deltaTime, 0));
            CambioDireccion(Collision collision);
        }

没用,我也试过了

    private void ChangeDirection(Collision collision)
    {
        if(collision.gameObject.tag == "MapLimit")
        {
            velocidad = velocidad * -1;
        }
    }

我不知道还能尝试什么

如果您声明一个方法接受 1 个参数:

private void CambioDireccion(Collision collision)
                             ^^^^^^^^^^^^^^^^^^^
                         1 parameter, of type Collision

调用时必须提供 1 个参数(参数值)。你不能像你所做的那样用 0 个参数调用它:

CambioDireccion();
               ^^
         0 arguments provided
 

要么在调用它时提供 1 个参数,要么修改方法以接受 0 个参数,或者将参数更改为可选参数以便可以使用 0 个或 1 个参数调用它:

CambioDireccion(...);                                   //calling the method providing an argument. Replace ... with some relevant instance of a Collision object. This is the most likely resolution
private void CambioDireccion(){                         //modify the method to accept 0 parameters. This will likely fail because the method body uses the passed-in argument
private void CambioDireccion(Collision collision = ...) //modify the method so the parameter is optional; provide a sensible default in place of `...`. Often this is `null`. The method body would have to be modified in some way to work for the case where the optional element was leveraged; perhaps checking for null and responding differently

您必须从这些选项中决定最合乎逻辑的行动方案。它可能会提供一个 Collision 对象,例如:

Collision c = ... //get a Collision from somewhere or make one
CambioDireccion(c);

当你调用一个方法并提供参数时,你不指定类型,只是指定类型的变量名称,或者 returns 类型实例的方法名称,或者调用一个新的类型(可能包括 属性 初始值设定项):

CambioDireccion(variableThatIsACollision);
CambioDireccion(MethodThatReturnsACollision());
CambioDireccion(new Collision());
CambioDireccion(new Collision() { Prop1 = Value1, Prop2 = Value2 });

只需删除“ChangeDirection();”从 Update 并将其名称更改为“OnCollisionEnter”,这些名称很重要,因为这些是在游戏中发生某些事情时调用的 Unity 消息。所以基本上你想等待 CollisionEnter 消息,然后检查标签并改变方向。 (在 VS 中按 Ctrl + Shift + M 可查看所有可用消息)