所以最近我和我的朋友们正在尝试制作一款有趣的游戏。目前,我碰壁了,不知道该怎么做。我正在尝试创建一个简单的基本脚本,在该脚本中,我可以通过右键单击来移动角色并进行攻击。如果它撞到地面,它将移动到那里,并且如果在目标的范围内,它将发送射弹。因此,游戏正在创建弹丸,但实际上并未移动。谁能告诉我我应该怎么做。起初,我想只制作一个脚本,但现在我认为最好为弹丸制作另一个脚本。
void Update()
{
if (Input.GetMouseButtonDown(1))
{
RaycastHit hit;
if(Physics.Raycast (Camera.main.ScreenPointToRay(Input.mousePosition), out hit) && hit.transform.tag == "Minion")
{
if(Vector3.Distance(this.transform.position, hit.point) <= atkRange)
{
GameObject proj = Instantiate(bullet) as GameObject;
proj.transform.position = Vector3.MoveTowards(this.transform.position, target, atkSpd);
}
}
else if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit, speed))
{
agent.destination = hit.point;
}
}
}
这就是我原来的东西。我很确定我在这里做错了。另外,我不确定是否应该为弹丸本身添加另一个脚本,或者是否没有必要。谢谢您的帮助或提示。
答案 0 :(得分:3)
对于初学者来说,我会使用Rigidbody
组件并让物理学来处理运动,但是如果您想使用Vector3.MoveTowards
,将需要一些工作:
Vector3.MoveTowards
是每帧都需要调用的东西。我猜bullet
是您的预制件,因此您需要为机芯制作一个新脚本并将其放置在该预制件上:
public class MoveToTarget : MonoBehaviour
{
private float _speed;
private Vector3 _target;
public void StartMovingTowards(Vector3 target, float speed)
{
_target = target;
_speed = speed;
}
public void FixedUpdate()
{
// Speed will be 0 before StartMovingTowards is called so this will do nothing
transform.position = Vector3.MoveTowards(transform.postion, _target, _speed);
}
}
将其附加到预制件后,请确保您获取参考并在实例化预制件副本时开始使用它:
GameObject proj = Instantiate(bullet) as GameObject;
var movement = proj.GetComponent<MoveToTarget>();
movement.StartMovingTowards(target, atkSpd);
如果您改走物理路线,请在子弹预制件中添加一个Rigidbody
组件,并获得对该组件的引用,而不用制作MoveToTarget
脚本:
GameObject proj = Instantiate(bullet) as GameObject;
var body = proj.GetComponent<Rigidbody>();
然后,您可以施加力并让物理接手:
body.AddForce(target - transform.position, ForceMode.Impulse);
答案 1 :(得分:0)
不要像现在那样设置位置
proj.transform.position = Vector3.MoveTowards(this.transform.position, target, atkSpd);
相反,添加characterController或刚体并使用rb.addVelocity。