在目标坐标处射击弹丸

时间:2019-05-12 20:21:23

标签: unity3d

目的:

我要创建一个冰球射击者,射击者每3秒产生一个冰球,然后将其射击到目标射击区域内的目标点;射击区域是跨越球门面部的平面,它充当射击区域,因为并非所有射击都在网上-冰球射击者在该射击区域中生成一个随机点,这就是它获取目标X,Y和Z的方式

我已经研究了移动对象的不同方式,例如transform.forward,transform.up等,但是我想寻找的是puckRB.MovePosition?

据我所知,将“ Is Kinematic”设置为true时,MovePosition方法会在冰球在整个环境中移动时为其添加物理特性,否则它将进行传送。我只是不确定如何将目标坐标与所需的其他内容一起放入其中?

void GetTarget()
{
    float scale = 1f;

    // Grabs the aiming plane
    Transform aimingPlane = GameObject.Find("AimingPlane").gameObject.transform.GetChild(1);

    // Gets the moving X & Y area of the plane
    float moveAreaX = aimingPlane.GetComponent<Renderer>().bounds.size.x / 2;
    float moveAreaY = aimingPlane.GetComponent<Renderer>().bounds.size.y / 2;

    // Generates a random value within the move area (X, Y)
    float ranX = Random.Range(-moveAreaX * scale, moveAreaX * scale);
    float ranY = Random.Range(-moveAreaY * scale, moveAreaY * scale);

    // Grabs the center of the AimingPlane
    Vector3 center = aimingPlane.GetComponent<Renderer>().bounds.center;

    // Gets the targets coordinates (X and Y)
    targetCoordsX = ranX + center.x;
    targetCoordsY = ranY + center.y;

    // Grabs AimingDot and places at target coordinates
    Transform aimingDot = GameObject.Find("AimingPlane").gameObject.transform.GetChild(0);
    aimingDot.position = new Vector3(targetCoordsX, targetCoordsY, center.z);
}


void FirePuck()
{
    GameObject puckCopy = Instantiate(puck, shotPos.transform.position, shotPos.transform.rotation) as GameObject;

    puckRB = puckCopy.GetComponent<Rigidbody>();

    Vector3 test = new Vector3(targetCoordsX, targetCoordsY);
    puckRB.MovePosition(test * Time.deltaTime);
}

总而言之,到目前为止,该程序会在射击区域内生成一个随机目标,每3秒产生一个新的冰球,而我现在正试图从射击者到该目标的冰球。冰球当前所做的只是将其传送到射击者前方的某个位置。

1 个答案:

答案 0 :(得分:0)

Rigidbody.MovePosition所做的所有操作都是立即将身体移动到新位置(传送)。

刚体用于模拟游戏对象上的物理。启用IsKinematic会禁用冰球的物理特性,允许其他对象检测到它们何时与冰球碰撞并从冰球反弹,但不会使冰球受到碰撞的影响。

您要禁用IsKinematic,然后设置冰球速度(速度):

puckRB.velocity = (destinationPos - currentPosition).normalized * speed;

从冰球的当前位置减去冰球的当前位置会得到方向矢量。 .normalized * speed会将其转换为单位向量(大小为1的向量,并将其乘以所需的行进速度)。

public float puckSpeed = 1f;

void FirePuck()
{
    GameObject puckCopy = Instantiate(puck, shotPos.transform.position, shotPos.transform.rotation) as GameObject;

    puckRB = puckCopy.GetComponent<Rigidbody>();

    puckRB.velocity = (new Vector3(targetCoordsX, targetCoordsY, targetCoordsZ) - puckRB.transform.position).normalized * puckSpeed;
}