我需要用我编写的代码统一替换“ input.getaxis(“ Horizontal”),以便从python文件获取输入。
我试图了解它是如何工作的,但是不幸的是我不太了解它,这是我所做的一些代码,我想知道它是否可以完成工作以及如何进行改进。
private void FixedUpdate()
var h = hh ;//h is the horizontal axis and hh is the previous value
var v = vv ;//v is the horizontal axis and vv is the previous value
if (inout == "W" || inout == "w")
{
if (v < 1)
{
v += 0.01f * wn; //wn is the multiplication for when the user
//presses the key continously {momentum}
}
wn += 1;
sn = 1;//number of presses
}
else if (inout == "S" || inout == "s")
{
if (v > (-1))
{
v -= 0.01f * sn;
}
wn = 1;
sn += 1;
}
else if (inout == "A" || inout == "a")
{
if (h > (-1))
{
h -= 0.01f*an;
}
an += 1;
dn = 1;
}
else if (inout == "D" || inout == "d")
{
if (h < 1)
{
h += 0.01f * dn;
}
an = 1;
dn += 1;
}
//Decaying of the momentum
if (inout != "W" && inout != "S"&& inout != "w" && inout != "s")
{
if (v > 0)
{
if (wn>1)
{
wn--;
}
v -= 0.01f * wn;
}
else if (v < 0)
{
if (sn>1)
{
sn--;
}
v += 0.01f * sn;
}
}
else if (inout != "A" && inout != "D"&& inout != "a" && inout != "d")
{
if (h > 0)
{
if (dn>1)
{
dn--;
}
h -= 0.01f * dn;
}
else if (h < 0)
{
if (an>1)
{
an--;
}
h += 0.01f * an;
}
}
hh = h;
vv = v;
简而言之,所有这些代码所做的就是当python文件发送输入“ W”时,例如,它将垂直轴的值增加(0.01)乘以w键的按下次数我们有机会建立动力,因为一旦使用者缓慢按下它,便会逐渐建立起来,然后迅速上升。 衰减部分是当用户释放键时,我们要释放我们建立的所有动量,以便撤消所有操作。
答案 0 :(得分:1)
如果您分开执行任务,则可以使用所需的任何机制替换输入。您可以使用Input.GetAxis
进行测试,然后在输出相同的情况下将输入切换为Python。
FixedUpdate
由Unity用于物理计算。相反,请接受Update
方法中的输入,然后将更改应用于FixedUpdate
中启用了物理的对象。
您所做的大部分工作都是通过内置的Unity Physics引擎实现的。为此,请使用Rigidbody
组件,而不是直接设置Transform
。您仍然可以基于FixedUpdate
内部的未输入而恶化,并立即应用所有更改,然后让物理引擎进行实际计算。
Input.GetAxis
返回一个float
,范围是-1到1 Input.GetAxis
根据操纵杆离中心的距离输出的范围是-1到1,因此0.01是微小的测量值。您必须按100次键才能获得与完全按下控制杆到一侧相同的输出。我将使用更接近-1和1的值,然后乘以Inspector中设置的某个值来产生良好的感觉答案 1 :(得分:1)
使用键盘,Unity的GetAxisRaw("Horizontal")
和GetAxisRaw("Vertical")
为每个轴返回-1、0或1。 GetAxis("Horizontal")
和GetAxis("Vertical")
的值通过使用这些原始输入的算法进行平滑处理。
这是一种可以近似化Unity平滑算法的方法,该方法可以平滑从键盘控制器的输入计算出的原始-1、0或1值:
private float slidingH;
private float slidingV;
private void FixedUpdate()
{
float h = 0f;
float v = 0f;
Vector2 smoothedInput;
if (inout.ToLower() == "w")
{
v = 1f;
}
else if (inout.ToLower() == "s")
{
v = -1f;
}
else if (inout.ToLower() == "a")
{
h = -1f;
}
else if (inout.ToLower() == "d")
{
h = 1f;
}
smoothedInput = SmoothInput(h,v);
float smoothedH = smoothedInput.x;
float smoothedV = smoothedInput.y;
}
private Vector2 SmoothInput(float targetH, float targetV)
{
float sensitivity = 3f;
float deadZone = 0.001f;
slidingH = Mathf.MoveTowards(slidingH,
targetH, sensitivity * Time.deltaTime);
slidingV = Mathf.MoveTowards(slidingV ,
targetV, sensitivity * Time.deltaTime);
return new Vector2(
(Mathf.Abs(slidingH) < deadZone) ? 0f : slidingH ,
(Mathf.Abs(slidingV) < deadZone) ? 0f : slidingV );
}
.
这是Unity QA网站上this answer by fafase中代码的修改版本。
作为旁注,根据您的需要,您可能希望添加一种从控制器发送多个同时按下的键的方法。