目的:
我要创建一个冰球射击者,射击者每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秒产生一个新的冰球,而我现在正试图从射击者到该目标的冰球。冰球当前所做的只是将其传送到射击者前方的某个位置。
答案 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;
}