Как сделать спавн холст с помощью рендер-камеры? - PullRequest
0 голосов
/ 18 октября 2018

UNITY 2D C #

У меня есть объект Canvas.

Мой холст - это изображение (СТРЕЛКА), которое указывает цель (ЗВЕЗДА).

Когда ЗВЕЗДА попадает в ИГРОКА, она уничтожается.

К сожалению, я не могу выключитьСТРЕЛКА и (при возобновлении ЗВЕЗДЫ) включите его снова, потому что после появления СТРЕЛКА указывает предыдущую цель.

Вот почему я должен уничтожить холст.

Я добавил скрипт в ЗВЕЗДУ:

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

public class DestroyTest : MonoBehaviour {


    public SpawnStar other;

    public GameObject Spawner;
    public GameObject ToDestroy;

    void Awake (){
        GameObject Spawner = GameObject.Find ("Spawner");
        other = Spawner.GetComponent<SpawnStar>();

    }


        void OnCollisionEnter2D (Collision2D coll){


    if (coll.gameObject.tag == "Player") {

            Destroy (gameObject);
            Debug.Log("DestroyedStar");
            GameObject ToDestroy = GameObject.Find ("Window_QuestPointer");
            Destroy (ToDestroy);

            Debug.Log("DestroyedOptionOne");
            other.Start ();
        }
    }
}

Я добавил скрипт в CANVAS:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using CodeMonkey.Utils;


public class Window_QuestPointer : MonoBehaviour {

[SerializeField] private Camera uiCamera;

public SpawnStar other;

public GameObject Spawner;

private Vector3 targetPosition;
private RectTransform pointerRectTransform;



void Awake (){
    GameObject Spawner = GameObject.Find ("Spawner");
    other = Spawner.GetComponent<SpawnStar>();
    other.Start ();

}

private void Start ()
{
    targetPosition = GameObject.FindWithTag("Star").transform.position;
    pointerRectTransform = transform.Find ("Pointer").GetComponent<RectTransform> ();



}
private void Update (){
    Vector3 toPosition = targetPosition;
    Vector3 fromPosition = Camera.main.transform.position;
    fromPosition.z = 0f;
    Vector3 dir = (toPosition - fromPosition).normalized;
    float angle = UtilsClass.GetAngleFromVectorFloat(dir);
    pointerRectTransform.localEulerAngles = new Vector3 (0, 0, angle);

    float borderSize = 40f;

    Vector3 targetPositionScreenPoint = Camera.main.WorldToScreenPoint (targetPosition);
    bool isOffscreen = targetPositionScreenPoint.x <= borderSize || targetPositionScreenPoint.x >= Screen.width - borderSize || targetPositionScreenPoint.y <= borderSize || targetPositionScreenPoint.y >= Screen.height - borderSize;
    Debug.Log (isOffscreen + " " + targetPositionScreenPoint);

    if(isOffscreen){
        Vector3 cappedTargetScreenPosition = targetPositionScreenPoint;
        cappedTargetScreenPosition.x = Mathf.Clamp (cappedTargetScreenPosition.x, borderSize, Screen.width - borderSize);
        cappedTargetScreenPosition.y = Mathf.Clamp (cappedTargetScreenPosition.y, borderSize, Screen.height - borderSize);

        Vector3 pointerWorldPosition = uiCamera.ScreenToWorldPoint (cappedTargetScreenPosition);
        pointerRectTransform.position = pointerWorldPosition;
        pointerRectTransform.localPosition = new Vector3 (pointerRectTransform.localPosition.x, pointerRectTransform.localPosition.y, 0f);

    }
    else{
        Vector3 pointerWorldPosition = uiCamera.ScreenToWorldPoint (targetPositionScreenPoint);
        pointerRectTransform.position = pointerWorldPosition;
        pointerRectTransform.localPosition = new Vector3 (pointerRectTransform.localPosition.x, pointerRectTransform.localPosition.y, 0f);

    }
}

}

Я добавил скрипт в объект SPAWNER:

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

public class SpawnStar : MonoBehaviour {



    private int waveNumber = 0;
    public int enemiesAmount = 0;
    public GameObject star;
public GameObject option;
    public Camera cam;
public GameObject objectToEnable;


    // Use this for initialization
    public void Start () {


    StartCoroutine (StarEnable());
        cam = Camera.main;
        enemiesAmount = 0;


    objectToEnable.SetActive (false);
    }

    // Update is called once per frame
public IEnumerator StarEnable () {
    yield return new WaitForSeconds (10f);
        float height = cam.orthographicSize + 1; // now they spawn just outside
        float width = cam.orthographicSize * cam.aspect + 1;
        if (enemiesAmount==0) {

                Instantiate(star, new Vector3(cam.transform.position.x + Random.Range(-width, width),3,cam.transform.position.z+height+Random.Range(10,30)),Quaternion.identity);
                enemiesAmount++;

        Instantiate (option, transform.position, transform.rotation);


        objectToEnable.SetActive (true);

            }

        }
    }

Кроме того, СТРЕЛКА должна возродиться на экране, а ЗВЕЗДА - на экране.

Ответы [ 3 ]

0 голосов
/ 18 октября 2018

Если у вас есть одна камера U, вы можете прикрепить простой скрипт, который находит Canvas, общий и присоединить камеру к нему в Start (), например:

public class AttachCamera: MonoBehavour
{
  private void Start()
  {
    gameObject.GetComponent<Canvas>().worldCamera = Camera.main;
  }
}

Если есть более одной камеры U, вы должны помнить, что они прикрепленыкамера и установить его вручную после появления Canvas.

0 голосов
/ 18 октября 2018

Не могли бы вы показать свой код, который отвечает за уничтожение холста?

Я бы использовал другой GameObject, который обрабатывает эту логику игрового процесса.

Сначала я бы использовал cameraObj.SetActive (false);отключить камеру, а не уничтожить ее.Уничтожение и создание объектов может иногда вызывать проблемы с памятью, и это просто не очень хорошая практика, если только в этом нет необходимости.

Затем используйте Coroutine и WaitForSeconds () или что-тоэтот эффект, чтобы подождать, а затем вызвать cameraObj.SetActive (true), чтобы повторно включить основной GameObject вашей камеры.

0 голосов
/ 18 октября 2018

вы не должны уничтожать холст или любой GameObject во время выполнения, отвечая на ваш вопрос, когда вы создаете префаб холста, устанавливаете камеру рендерера с canvas.worldCamera, но вы можете вместо разрушения холста создать контейнер внутрииз этого поместите все GameObjects внутри этого контейнера GameObject, и активируйте и деактивируйте его при необходимости.

...