Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.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 - Fatal编程技术网

C# 我能速记我的动作脚本吗?

C# 我能速记我的动作脚本吗?,c#,unity3d,C#,Unity3d,我对unity和C#编码还不熟悉,我想看看我为运动编写的代码是否可以写得更简捷,甚至只是改进运动的流程。我想,当我在上面添加更多脚本时,看到问题的简短解决方案也会对我有所帮助。谢谢 //Variables Rigidbody rb; public GameObject player; public float speed = 4f; private float minLimit = 0.51f; //MinLimit is the height you need to be below so y

我对unity和C#编码还不熟悉,我想看看我为运动编写的代码是否可以写得更简捷,甚至只是改进运动的流程。我想,当我在上面添加更多脚本时,看到问题的简短解决方案也会对我有所帮助。谢谢

//Variables
Rigidbody rb;
public GameObject player;
public float speed = 4f;
private float minLimit = 0.51f; //MinLimit is the height you need to be below so you can jump
private float airTime = 0.875f; //The amount of time spent in the air if you press a movement key
private float maxLimit = 3.66f; //Maxlimit is the maximum jump height
下面是动作脚本。想象一下,这是为所有四个方向复制和粘贴的。由于(我认为)摄像机的位置,玩家的移动方向与正常方向相反

    if (Input.GetKey(KeyCode.LeftArrow) || Input.GetKey(KeyCode.A))
    {
        if (transform.position.y > minLimit && !Input.GetKey(KeyCode.Space) && transform.position.y < maxLimit)
        {
            if (Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.LeftArrow))
            {
                rb.velocity = new Vector3(1, -airTime, 0) * speed;
            }
        }

        else
        {
            if (Input.GetKeyDown(KeyCode.Space) && player.transform.position.y < minLimit)
            {
                rb.velocity = new Vector3(1, 2, 0) * speed;
            }
            if (!Input.GetKey(KeyCode.S) && !Input.GetKey(KeyCode.W) && !Input.GetKey(KeyCode.UpArrow) && !Input.GetKey(KeyCode.DownArrow) && !Input.GetKey(KeyCode.Space))
            {
                rb.velocity = new Vector3(1, 0, 0) * speed;
            }
            if (Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow))
            {
                rb.velocity = new Vector3 (1, 0, 1) * speed;
            }
            if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow))
            {
                rb.velocity = new Vector3(1, 0, -1) * speed;
            }
        }
    }
if(Input.GetKey(KeyCode.LeftArrow)| Input.GetKey(KeyCode.A))
{
if(transform.position.y>minLimit&&!Input.GetKey(KeyCode.Space)&&transform.position.y
欢迎来到StackOverflow。既然你至少对C#和Unity的编码还不熟悉,那么一定要首先接受以下建议:继续做你所做的事情——首先让它工作起来,然后看看你是否能改进它。:)

首先,我建议您不要使用基于
KeyCode
的输入,而是研究其工作原理。目前,这是声明输入键绑定的标准方法,无需考虑代码中的实际键。2019.3之后的Unity版本中出现了另一种方法,但现在这可能有点太复杂了

输入管理器允许您定义一个特定的操作,比如说
Fire
,然后将按键、鼠标移动、按钮和操纵杆输入绑定到该操作。在代码中,您可以使用或使用操作名称来引用该操作:

Input.GetButtonDown(“火灾”)
如果您决定稍后更改键绑定,则无需修改代码

对于您的代码,我建议您首先将所有内容放入具有“说话”名称的单个变量中:

到目前为止,您的代码只改变了可读性(不过,请记住,代码是由人而不是机器读取的)

对于接下来的步骤,这里有一些提示:

  • 对象的
    变换
    (属性)具有指向对象前进方向的
    向前
    属性
  • 始终使用方向向量,然后缩放它们(例如,通过
    速度
  • 如果需要同时考虑不同的方向,请添加方向向量,然后再次规格化
  • 要跳跃,可以通过调用
    rb.AddForce(Direction*Intensity,ForceMode.pulse)
    尝试向刚体添加一个
根据这些信息,尽量将关注点分开:

private void Update()
{
//GetAxis已经为您提供了积极或消极的概念,例如。
//左或右。尝试使用axisValue*transform.forward。
var moveIntensity=Input.GetAxis(“水平”);
如果(移动强度!=0)TryMove(移动强度);
var jump=Input.GetButtonDown(“跳转”);
if(jump)TryJump();
}
我个人喜欢将这些操作分为
DoSomething()
TryDoSomething()
,在这两种情况下,我只会在某些事情确实应该做的时候调用
DoSomething()
,而当调用可能由于进一步的逻辑而失败时调用
TryDoSomething()
。此处,
TryJump()
表示用户表示希望跳转,但可能不会导致任何状态变化,例如,因为用户处于半空中

也许这已经给了你一些想法

其他地方的示例代码 既然你在问如何将你的代码推广到多个方向,我只是回答你使用不同的代码,但没有给你不同的解决方案——这里有一个额外的解决方案。这是我不久前为玩家控制器使用的一些代码,涉及步行和跳跃:

[序列化字段]
私人浮动速度;
[序列化字段]
私人部队;
[序列化字段]
专用浮子接地距离=0.7f;
私人刚体钻机;
私人空间
{
_rig=GetComponent();
}
私有void更新()
{
Move();
//在Unity中,为输入配置选择“编辑>项目设置>输入”。
if(Input.GetButtonDown(“跳转”))
{
TryJump();
}
}
无效移动()
{
var xInput=Input.GetAxis(“水平”);
var zInput=Input.GetAxis(“垂直”);
//设置一个新的速度矢量。
var dir=新向量3(xInput,0,zInput)*移动速度;
//在不受移动速度影响的情况下,在y方向上补片速度。。
dir.y=_rig.velocity.y;
//将更新的速度指定给刚体。
_rig.velocity=dir;
//根据运动矢量更新前进方向。
var facingDir=新向量3(xInput,0,zInput);
如果(朝向方向sqrMagnitude>0)
{
transform.forward=facingDir;
}
}
void TryJump()
{
//这将实现光线投射跳跃:
//我们向下射出一道光线,看看我们是否在地面上。玩家高度为
//1个单位和物体中心的参考点,最大距离
var moveLeft = Input.GetButton("Left"); // Input.GetKey(KeyCode.LeftArrow) || Input.GetKey(KeyCode.A);
var moveUp = Input.GetButton("Up");     // Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow);
var moveDown = Input.GetButton("Down"); // Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow);
var jump = Input.GetButtonDown("Jump"); // Input.GetKeyDown(KeyCode.Space);

if (moveLeft)
{
    if (!jump && transform.position.y > minLimit && transform.position.y < maxLimit)
    {
        // No need to check for "Left Arrow || A" again, because you already did.
        rb.velocity = new Vector3(1, -airTime, 0) * speed;
    }
    else
    {
        if (jump && player.transform.position.y < minLimit)
        {
            rb.velocity = new Vector3(1, 2, 0) * speed;
        }
        if (!moveUp && !moveDown)
        {
            rb.velocity = new Vector3(1, 0, 0) * speed;
        }
        if (moveDown)
        {
            rb.velocity = new Vector3 (1, 0, 1) * speed;
        }
        if (moveUp)
        {
            rb.velocity = new Vector3(1, 0, -1) * speed;
        }
    }
}