首页 > 解决方案 > 无法将类型“UnityEngine.GameObject”隐式转换为“GameObject”

问题描述

大家好,提前感谢您的回答!

我是一个统一的初学者,在完成几个教程后编写我的第二个游戏。从今天开始,我突然注意到我所有的“游戏对象”都有一个“UnityEngine”。在他们面前。

我不知道这是怎么发生的,而且它不仅在一个脚本中,而且在所有脚本中。这是它的一个例子:

UnityEngine.GameObject item = (UnityEngine.GameObject)Instantiate(itemGOList[i], spawnTransform, spawnRotation);

这在没有“UnityEngine.”的情况下工作得很好,但现在它只有在以这种方式编写时才有效。

你知道这是怎么发生的以及如何恢复它吗?

这是脚本之一:

using UnityEngine;
using UnityEngine.EventSystems;

public class Turret : MonoBehaviour
{

    private Transform target;
    private Enemy targetEnemy;

    [Header("General")]

    public float range = 10f;

    [Header("Use Bullets/missiles (default)")]
    public UnityEngine.GameObject bulletPrefab;
    public float fireRate = 1f;
    private float fireCountdown = 0f;

    public AudioClip shootingSound;
    private AudioSource audioSource;

    [Header("Use Laser (default)")]
    public bool useLaser = false;

    public int damageOverTime = 20;

    public float slowAmount = .5f;

    public LineRenderer lineRenderer;
    public ParticleSystem impactEffect;
    public Light impactLight;

    [Header("Unity Setup Fields")]


    public string enemyTag = "Enemy";

    public Transform partToRotate;
    public float turnSpeed = 10f;

    public Transform firePoint;

    void Start()
    {
        InvokeRepeating(nameof(UpdateTarget), 0f, 0.3f); // Call the UpdateTarget Method after 0 seconds, then repeat every 0.3 seconds.
        audioSource = GetComponent<AudioSource>(); //Puts the AudioSource of this GO (the turret) into the variable audioSource.
    }

    void UpdateTarget ()
    {
        UnityEngine.GameObject[] enemies = UnityEngine.GameObject.FindGameObjectsWithTag(enemyTag); // Find all enemies (and store in a list?).
        float shortestDistance = Mathf.Infinity; // Create a float for the shortest distance to an enemy.
        UnityEngine.GameObject nearestEnemy = null; // Create a variable which stores the nearest enemy as a gameobject.

        foreach (UnityEngine.GameObject enemy in enemies) // Loop through the enemies array.
        {
            float distanceToEnemy = Vector3.Distance(transform.position, enemy.transform.position); //Get the distance to each enemy and stores it.
            if (distanceToEnemy < shortestDistance) // If any of the enemies is closer than the original, make this distance the new shortestDistance and the new enemy to the nearestEnemy.
            {
                shortestDistance = distanceToEnemy;
                nearestEnemy = enemy;
            }
        }
        if (nearestEnemy != null && shortestDistance <= range) // Sets the target to the nearestEnemy (only if its in range and not null).
        {
            target = nearestEnemy.transform;
            targetEnemy = nearestEnemy.GetComponent<Enemy>();
        }
        else
        {
            target = null;
        }
    }

    void Update()
    {
            if (target == null) // If there is no target, do nothing.
        {
            if (useLaser)
            {
                if (lineRenderer.enabled)
                {
                    lineRenderer.enabled = false;
                    impactEffect.Stop();
                    impactLight.enabled = false;
                    audioSource.Stop();
                }
            }
            return;
        }
        LockOnTarget();

        if (useLaser)
        {
            Laser();
        }
        else
        {
            if (fireCountdown <= 0f)
            {
                Shoot();
                fireCountdown = 1f / fireRate;
            }

            fireCountdown -= Time.deltaTime;
        }

        
    }

    void Laser()
    {
        targetEnemy.TakeDamage(damageOverTime * Time.deltaTime);
        targetEnemy.Slow(slowAmount);

        if (!lineRenderer.enabled)
        {
            lineRenderer.enabled = true;
            impactEffect.Play();
            impactLight.enabled = true;
            if (audioSource.isPlaying == false)
            {
                audioSource.Play();
            }
        }
        lineRenderer.SetPosition(0, firePoint.position);
        lineRenderer.SetPosition(1, target.position);

        Vector3 dir = firePoint.position - target.position;

        impactEffect.transform.position = target.position + dir.normalized * 1f;

        impactEffect.transform.rotation = Quaternion.LookRotation(dir);
    }

    void LockOnTarget()
    {
        Vector3 dir = target.position - transform.position; // Store the direction from turret to target.
        Quaternion lookRotation = Quaternion.LookRotation(dir); // I have no idea how this works...
        Vector3 rotation = Quaternion.Lerp(partToRotate.rotation, lookRotation, Time.deltaTime * turnSpeed).eulerAngles; // Convert quaternion angles to euler angles and Lerp it (smoothing out the transition).
        partToRotate.rotation = Quaternion.Euler(0f, rotation.y, 0f); // Only rotate around the y-axis.
    }
    
    void Shoot()
    {
        UnityEngine.GameObject bulletGO = (UnityEngine.GameObject)Instantiate(bulletPrefab, firePoint.position, firePoint.rotation); // Spawn a bullet at the location and rotation of firePoint. (Also makes this a GO to reference it.
        Bullet bullet = bulletGO.GetComponent<Bullet>(); // I have no idea how this works...
        audioSource.PlayOneShot(shootingSound, 0.2f);


        if (bullet != null) // If there is a bullet, use the seek method from the bullet script.
        {
            bullet.Seek(target);
        }

    }
    void OnDrawGizmosSelected() // Do this method if gizmo is selected.
    {
        Gizmos.color = Color.red;
        Gizmos.DrawWireSphere(transform.position, range); // Draw a wire sphere on the selected point (selected turret f. e.) and give it the towers range.
    }

   
}

标签: c#unity3d

解决方案


问题是我的 Unity 项目中有一个名为“GameObject”的脚本。

通过使用 Visual Studio 中的快速操作,我还能够将所有“UnityEngine.GameObject”重命名为“Gameobject”。


推荐阅读