Как сделать так, чтобы этот игровой объект создавался как дочерний объект родительского игрового объекта со смещением? - PullRequest
1 голос
/ 29 марта 2020

Я следовал инструкции C# в Unity, чтобы создать простую игру Space Invaders. Сейчас я пытаюсь понять, какие функции используются.

Этот класс называется PlayerController. Он также определяет игровой объект «выстрел», поле, которое затем снабжается префабом пули:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    private Transform player;
    public float speed;
    public float maxBound, minBound;

    public GameObject shot;
    public Transform shotSpawn;
    public float fireRate;

    private float nextFire;
    // Start is called before the first frame update
    void Start()
    {
        player = GetComponent<Transform> (); 
    }

    // Update is called once per frame
    void FixedUpdate()
    {
        float h = Input.GetAxis ("Horizontal");
        if (player.position.x < minBound && h < 0)
            h = 0;
        else if (player.position.x > maxBound && h > 0)
            h = 0;
        player.position += Vector3.right * h * speed;
    }

    void Update()
    {
        if (Input.GetButton("Fire1") && Time.time > nextFire)
        {
            nextFire = Time.time + fireRate;
            Instantiate(shot, shotSpawn.position, shotSpawn.rotation);
        }
    }
}

Объект пули использует класс BulletController:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BulletController : MonoBehaviour
{
    private Transform bullet;
    public float speed;
    // Start is called before the first frame update
    void Start()
    {
        bullet = GetComponent<Transform>();
    }
    void FixedUpdate()
    {
        bullet.position += Vector3.up * speed;
        if (bullet.position.y >= 10)
            Destroy(gameObject);
    }
    void OnTriggerEnter2D(Collider2D other)
    {
        if (other.tag == "Enemy")
        {
            Destroy(other.gameObject);
            Destroy(gameObject);
            PlayerScore.playerScore++;
        }
        else if (other.tag == "Base")
            Destroy(gameObject);

    }
}

Из того, что я понимаю, У объекта преобразования есть значения для положения, поворота и масштаба. Итак, во-первых, что означает объявление x = GetComponent; do?

Во-вторых, откуда "shotSpawn" берет свои значения? От объекта, к которому применяется код?

В-третьих, пуля создается точно в центре квадрата, служащего телом корабля игрока, но я хочу, чтобы она начиналась выше по оси y, поэтому она начинается в конце формы пушки. Кажется также, что он графически пересекается с корпусом корабля, поэтому я хотел немного переместить его по оси z. Так как вы можете написать это? Я попытался добавить к значению shotSpawn.position, но он продолжает объявлять ошибки.

Заранее спасибо.

1 Ответ

2 голосов
/ 29 марта 2020
  1. A GetComponent означает в основном просто захват компонента объекта. Возьмите простой пример: Main Camera имеет много компонентов:

1.1. Transform компонент. Этот компонент, как вы поняли, используется для определения положения, поворота и масштабирования объекта

1.2. Camera компонент. Здесь много полей

1.3. A Flare Layer компонент.

et c.

Эти компоненты могут быть получены с помощью скрипта. Причина, по которой разработчики используют это, заключается в их свойствах. Например, сказав Transform playerTransformComp = player.GetComponent<Transform>();, вы сможете написать playerTransformComp.position. position является свойством объектов типа Transform.

Я не думаю, что GetComponent, которые вы видели в этом уроке, полезны, потому что каждый игровой объект в любом случае имеет компонент преобразования, поэтому, если они объявили игрока как public GameObject player;, то вместо этого использовали player.transform.position было бы намного проще. На самом деле, я не думаю, что имеет смысл даже объявлять что-то как Transform, а затем захватывать компонент Transform. Как сказал @BugFinder в предыдущем посте, урок в целом довольно плохой.


shotSpawn берет свои значения из ... самого себя! Это публичный c объект, поэтому я предполагаю, что вы перетащили и уронили shotSpawn объект со сцены в поля скрипта. Это означает, что объект shotSpawn из сценария - это объект, который вы перетаскивали на поля сценария. Вы можете использовать все его функции, и перетаскиваемый объект будет затронут. Таким образом, вы можете использовать shotSpawn.position и shotSpawn.rotation. Я мог бы повторить здесь немного, но, пожалуйста, обратите внимание, что shotSpawn является Transform объектом, поэтому вы можете использовать типичные свойства Transform объекта.


В документации на Transform.position (а также на Transform.rotation сказано, что вы должны использовать Vector3 объекты для добавления или вычитания значений к ним.

Можно сделать shotSpawn.position + new Vector3(10f, 5f, 10f). Естественно, вы также можете сделать

value = new Vector3(10f, 5f, 10f);

, а затем Instantiate(shot, shotSpawn.position + value, shotSpawn.rotation);

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

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