如何在Unity中创建投射脚本

时间:2019-01-30 21:32:45

标签: unity3d

所以最近我和我的朋友们正在尝试制作一款有趣的游戏。目前,我碰壁了,不知道该怎么做。我正在尝试创建一个简单的基本脚本,在该脚本中,我可以通过右键单击来移动角色并进行攻击。如果它撞到地面,它将移动到那里,并且如果在目标的范围内,它将发送射弹。因此,游戏正在创建弹丸,但实际上并未移动。谁能告诉我我应该怎么做。起初,我想只制作一个脚本,但现在我认为最好为弹丸制作另一个脚本。

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;
        }
    }
}

这就是我原来的东西。我很确定我在这里做错了。另外,我不确定是否应该为弹丸本身添加另一个脚本,或者是否没有必要。谢谢您的帮助或提示。

2 个答案:

答案 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。