Как создать сценарий снаряда в Unity - PullRequest
0 голосов
/ 31 января 2019

так что недавно мы с друзьями пытаемся сделать игру для развлечения.В настоящее время я врезался в стену и не уверен, как это сделать.Я пытаюсь создать простой базовый сценарий, в котором персонаж перемещается и атакует правой кнопкой мыши.Если он упадет на землю, он будет перемещаться туда и, если он находится в пределах досягаемости от цели, отправит снаряд.Таким образом, игра создает снаряд, но фактически не движется.Может кто-нибудь сказать мне, что я, вероятно, должен делать.Сначала я думал сделать все это одним сценарием, но теперь я думаю, что будет лучше сделать еще один сценарий для снаряда.

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 голосов
/ 31 января 2019

Для начала я бы посоветовал использовать компонент 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);
0 голосов
/ 31 января 2019

Не устанавливайте позицию, как у вас сейчас

proj.transform.position = Vector3.MoveTowards(this.transform.position, target, atkSpd);

Вместо этого, добавьте контрольный контроллер персонажа или твердое тело и используйте rb.addVelocity.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...