C# 在第一人称视图方向3d中添加力

C# 在第一人称视图方向3d中添加力,c#,unity3d,C#,Unity3d,假设我有两个对象: 对象A:玩家(第一人称) 对象B:球(例如足球) 我想朝着我所看到的方向击球,给它真实的物理效果,就像它在现实生活中起作用一样 这就是我到目前为止得到的(这或多或少只是为了测试,这就是代码看起来如此混乱的原因): 使用UnityEngine; 使用系统集合; 公共类KickScript:单行为 { public float bounceFactor=0.9f;//确定球落地后的反弹方式。值为[0..1] 公众浮力系数=10f; 公共浮点tMax=5f;//按下时间上限 p

假设我有两个对象:

  • 对象A:玩家(第一人称)
  • 对象B:球(例如足球)
我想朝着我所看到的方向击球,给它真实的物理效果,就像它在现实生活中起作用一样

这就是我到目前为止得到的(这或多或少只是为了测试,这就是代码看起来如此混乱的原因):

使用UnityEngine;
使用系统集合;
公共类KickScript:单行为
{
public float bounceFactor=0.9f;//确定球落地后的反弹方式。值为[0..1]
公众浮力系数=10f;
公共浮点tMax=5f;//按下时间上限
private float kickForce;//保持按钮按下和释放之间的时间间隔
私有向量3 prevVelocity;//保持刚体速度,在FixedUpdate()中计算
无效更新()
{
if(Input.GetMouseButtonDown(0))
{
Ray-Ray=Camera.main.screenpointoray(输入.鼠标位置);
雷卡斯特击中;
如果(物理.光线投射(光线,出击))
{
if(hit.collider.name==“Ball”)//在Inspector中将Ball对象重命名为“Ball”,或在此处更改名称
冲击力=时间。时间;
}
}
}
void FixedUpdate()
{
如果(反作用力!=0)
{
浮动角度=随机范围(0,20)*Mathf.Deg2Rad;
GetComponent().AddForce(新矢量3(0.0f,力系数*数学夹具(冲击力,0.0f,tMax)*数学正弦(角度),力系数*数学夹具(冲击力,0.0f,tMax)*数学科斯(角度)),力模式速度变化);
冲击力=0;
}
prevVelocity=GetComponent().velocity;
}
无效碰撞中心(碰撞柱)
{
如果(col.gameObject.tag==“Ground”)//不要忘记将标记分配给字段
{
GetComponent().velocity=新向量3(prevVelocity.x,-prevVelocity.y*Mathf.Clamp01(bounceFactor),prevVelocity.z);
}
}
}

由于某些原因,它只在“z”方向上移动。

为了达到所需的效果,您还必须在x方向上施加一些力。这可以通过改变你施力的线来实现,比如

Vector3 direction = new Vector3(Mathf.Cos(angle), 0f, Mathf.Sin(angle));
Vector3 force = direction * forceFactor * Mathf.Clamp(kickForce, 0.0f, tMax);
GetComponent<Rigidbody>().AddForce(force, ForceMode.VelocityChange);
Vector3方向=新矢量3(数学Cos(角度)、0f、数学Sin(角度));
矢量3力=方向*力系数*数学夹具(冲击力,0.0f,tMax);
GetComponent().AddForce(force,ForceMode.VelocityChange);
这样,你的角度将是围绕你的力将被施加的y轴旋转。您还必须确定球在y轴上的一些向上力。在上面的代码片段中,我刚刚将其设置为0

Vector3 direction = new Vector3(Mathf.Cos(angle), 0f, Mathf.Sin(angle));
Vector3 force = direction * forceFactor * Mathf.Clamp(kickForce, 0.0f, tMax);
GetComponent<Rigidbody>().AddForce(force, ForceMode.VelocityChange);