2013-03-30 4 views
0

В моей 2-й игре у меня есть несколько элементов OnGui для выбора пользователем, однако курсор, который использует im, является другим элементом ongui (с помощью kinect для навигации), это возможно случайно, в настоящий момент, когда я использую самолеты, но я буду масштабировать и выходить из камеры, так что, по сути, они должны быть привязаны к экрану. Любые идеи, предложения или обходные пути. Это мой курсор.Элементы OnGui, взаимодействующие с другими элементами OnGui

using UnityEngine; 
using System; 
using System.Collections; 

public class PillarAgent : MonoBehaviour { 

public SkeletonWrapper sw; 
public Vector3 distance; 

public float progress =0f; 

public Texture2D cursor; 
public Texture2D load; 

public Camera mainCam; 

public float startTime; 
private int roundedRestSecounds; 

// Use this for initialization 

    float differencex = 0; 
    float differencey = 0; 

void Start() { 

    distance =new Vector3(0f,0f,0f); 

} 
float translate(float value, float leftMin, float leftMax, 
     float rightMin,float rightMax) 
{ 
    float leftSpan = leftMax - leftMin; 
    float rightSpan= rightMax - rightMin; 

    float valueScaled = (value-leftMin)/(leftSpan); 
    return rightMin+(valueScaled * rightSpan); 
} 
// Update is called once per frame 
void Update() { 
    if (sw.pollSkeleton()) 
    { 
     distance.x=sw.bonePos[0,0].x - sw.bonePos[0,7].x;//5 is left shoulder 
     distance.y=sw.bonePos[0,0].y -sw.bonePos[0,7].y; 


     differencex=translate(distance.x,.6f,0,0,Screen.width); 
     differencey=translate(distance.y,-.5f,0,0,Screen.height); 
     //Debug.Log(); 

     float width = sw.bonePos[0,5].x+ sw.bonePos[0,9].x; 
     float height =sw.bonePos[0,4].y- sw.bonePos[0,0].y; 
     float heightdiv= (height/2)+sw.bonePos[0,0].y;   
    }  
} 

void OnGUI() { 
    //left top width height 
    Rect r = new Rect(differencex,differencey,80,50); 

    GUI.Label(r,cursor); 
    GUI.BeginGroup(new Rect(differencex,differencey+50,50*Mathf.Clamp01(progress),15)); 
    //Debug.Log(progress); 
    GUI.DrawTexture(new Rect(0,0,50,50),load); 
    GUI.EndGroup(); 

    transform.position =mainCam.ScreenToWorldPoint(new Vector3(differencex,Screen.height-differencey,50)); 

    //mainCam.fieldOfView()  
} 

void OnCollisionStay(Collision Other) 
{ 
    startTime+=Time.deltaTime; 

    if(Other.gameObject.GetComponent(typeof(TextControl))) 
    { 
     roundedRestSecounds=Mathf.CeilToInt(Time.time); 

     progress = Time.time *0.2f; 

     CurrentState=true; 
    } 
    else if(Other.gameObject.tag==("Scalpal")){ 


     progress = startTime *0.5f; 
     //scallpall activated 
     //  
    }   
} 

void OnCollisionExit(Collision Other){ 
    startTime =0f; 
    progress =0f;   
} 

public Boolean CurrentState{get;set;} 
} 

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

using UnityEngine; 
using System.Collections; 

public class SelectTool : MonoBehaviour { 

public Tools tools; 
public float startTime; 
public bool ScalpalSelected; 
public GameObject selectedTool; 

void Start() 
{ 
    tools = this.GetComponent<Tools>(); //in order to use this tools muyst be attached to the game object 
    //this is essentially saying with regards to this game object get the component named tools 
} 
void update() 
{ 

} 
void OnCollisionStay(Collision Other) 
{ 
    startTime +=Time.deltaTime; 

    if(startTime >5f){ 
     if(Other.collider.tag==("Scalpal")) 
     { 
      selectedTool = Other.collider.gameObject; 
      Debug.Log(selectedTool+" What in gods good name is:" +tools.utilities[0]); 

     } 
     else { 
      selectedTool=null; 
     } 
     if(selectedTool){ 
      for(int i=0;i<tools.utilities.Length;i++) 
      { 

      }  
     } 


      ScalpalSelected=true; 
      renderer.material.color = Color.yellow;  
    } 
} 
void OncollisionStay(Collision other){ 

    startTime = 0f; 
} 

} 
+0

Здравствуйте. Трудно понять, что именно вы пытаетесь сделать. Попытайтесь расширить свои вопросы, указав примеры кода, с которым вы столкнулись. –

+0

@EvilClosetMonkey жалеет об этом, по сути, единственный способ, которым я могу придумать, это сделать то, что я сделал с помощью курсора, и это создать другой объект для взаимодействия с игровым миром. –

+1

хорошо, если бы я понял, что вы сказали правильно, вы хотите, чтобы ваши объекты самолета двигались вместе с камерой. Легкий способ сделать это - вставить эти плоские объекты в камеру как дочерние объекты. Затем, когда вы перемещаете камеру, они автоматически перемещаются вместе с ней. –

ответ

1

Из секции комментария к вопросу, который я предполагаю, что вы хотите знать, как это сделать:

»... Вы хотите, чтобы ваши плоские объекты двигаться вместе с камерой .. . "- Стивен Миллс

" спасибо @StevenMills Есть ли у вас пример того, как это можно сделать? " J бель

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

Идея этого заключается в создании сценария (таким образом, следующий привязываясь к MainCamera), которая будет искать через все GameObject в Object Hierarchy с методом GameObject.FindGameObjectsWithTag. Как только у нас есть все наши GameObject с ассоциированным Tag, мы можем затем пропустить массив и родительский файл GameObject для каждого из них.

public class ParentGameObjects : MonoBehaviour { 
    //The tag to search for on all game objects in the hierarchy 
    public String objectTag; 

    //The game objects that we will parent the main camera to 
    private GameObject[] children; 
    //It's not necessary to store references to the children but if you want to modify them at some point you will be able to 

    void Start() { 
     //Find all game objects with the tag we want 
     children = GameObject.FindGameObjectsWithTag(objectTag); 
     //Loop through all of the game objects found and parent this object's transform 
     for(int i = 0; i < children.Length; i++) { 
      children[i].transform.parent = transform; 
     } 
    } 
} 

Теперь, есть несколько вещей, которые вы должны сделать для этого сценария на работу:

  1. Вложите этот скрипт на любой GameObject, что вы хотите родительские другие объекты.
  2. В Inspector из GameObject, к которому прикреплен сценарий, введите имя Tag, которое вы хотите использовать.
  3. Для всех GameObject (и) в Hierarchy, которые следует добавить в качестве детей, назначьте то же самое Tag.

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

Смежные вопросы