C#, Unity en HTC Vive

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Silasje
  • Registratie: April 2008
  • Laatst online: 21-08 16:54

Silasje

www.Entjes.eu

Topicstarter
Hallo heren,

Ik wil in Unity een spelletje maken waarbij ik een ander materiaal aan een object geef terwijl ik deze aanraak. Dit om duidelijk aan te geven welk object je op dat moment selecteert. Tegelijkertijd komt er een menu boven mijn HTC Vive controller in beeld waarbij ik op "ignore" kan klikken.

Het werkt perfect, het highlight materiaal werkt perfect bij het aanraken van het object. Ook bij de controller weer uit het object halen werkt de highlight prima.Net zoals het menu. Alleen met de ignore knop op het menu selecteren werkt het niet. Het menu verdwijnt weer, maar de highlight gaat niet weg.

Het probleem hierbij is dat, het gehighlighte object ongeveer 1000x voor gaat komen. Dus 1 voor 1 in de inspector aangeven welk object het is, is geen optie. Op de objecten komt de code waarin de materialen verandert worden. Het aansturen komt op de scripts van de controller.


De code op de controllers:
code: Controllerscript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
    //Function to hide menu
    public void HideMenu()
    {
        showMenu = false;
        canvas.transform.position = CanvasPosition;
        disableHighlight();
    }

    //When entering object with Controller
    void OnTriggerEnter(Collider Col)
    {
        showMenu = true;
        grabTxt.text = "Grab " + Col.name;
    }

    //When still touching Object with Controller
    void OnTriggerStay(Collider Col)
    {
        if (showMenu)
        {
            UpdateMenu();
        }
    }

    //When leaving Object with Controller
    void OnTriggerExit(Collider Col)
    {
        showMenu = false;
        HideMenu();
        disableHighlight();
    }



De code op de gameObjecten:
code: ObjectScript
1
2
3
4
5
6
7
8
9
10
11
12
13
    public void enableHighlight()
    {
        Debug.Log("highlight checked");
        _oldMaterial = _meshRenderer.material;
        _meshRenderer.material = _highlightMaterial;
    }

    public void disableHighlight()
    {
        GameObject.FindGameObjectsWithTag("interactable");
        _meshRenderer.material = _oldMaterial;
        Debug.Log("highlight UNchecked");
    }


Misschien zien jullie zo waar ik de fout in ga.

Canon 7D MII, 550D, Tokina 11-16mm F2.8, Sigma 17-70mm F2.8/4, Sigma 30MM F1.4, Canon 50mm 1.8 STM, Sigma 70-200 F2.8, En de bende eromheen


Acties:
  • 0 Henk 'm!

  • Merethil
  • Registratie: December 2008
  • Laatst online: 13-09 12:10
Silasje schreef op donderdag 9 november 2017 @ 16:02:
Hallo heren,

Ik wil in Unity een spelletje maken waarbij ik een ander materiaal aan een object geef terwijl ik deze aanraak. Dit om duidelijk aan te geven welk object je op dat moment selecteert. Tegelijkertijd komt er een menu boven mijn HTC Vive controller in beeld waarbij ik op "ignore" kan klikken.

Het werkt perfect, het highlight materiaal werkt perfect bij het aanraken van het object. Ook bij de controller weer uit het object halen werkt de highlight prima.Net zoals het menu. Alleen met de ignore knop op het menu selecteren werkt het niet. Het menu verdwijnt weer, maar de highlight gaat niet weg.

Het probleem hierbij is dat, het gehighlighte object ongeveer 1000x voor gaat komen. Dus 1 voor 1 in de inspector aangeven welk object het is, is geen optie. Op de objecten komt de code waarin de materialen verandert worden. Het aansturen komt op de scripts van de controller.


De code op de controllers:
code: Controllerscript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
    //Function to hide menu
    public void HideMenu()
    {
        showMenu = false;
        canvas.transform.position = CanvasPosition;
        disableHighlight();
    }

    //When entering object with Controller
    void OnTriggerEnter(Collider Col)
    {
        showMenu = true;
        grabTxt.text = "Grab " + Col.name;
    }

    //When still touching Object with Controller
    void OnTriggerStay(Collider Col)
    {
        if (showMenu)
        {
            UpdateMenu();
        }
    }

    //When leaving Object with Controller
    void OnTriggerExit(Collider Col)
    {
        showMenu = false;
        HideMenu();
        disableHighlight();
    }



De code op de gameObjecten:
code: ObjectScript
1
2
3
4
5
6
7
8
9
10
11
12
13
    public void enableHighlight()
    {
        Debug.Log("highlight checked");
        _oldMaterial = _meshRenderer.material;
        _meshRenderer.material = _highlightMaterial;
    }

    public void disableHighlight()
    {
        GameObject.FindGameObjectsWithTag("interactable");
        _meshRenderer.material = _oldMaterial;
        Debug.Log("highlight UNchecked");
    }


Misschien zien jullie zo waar ik de fout in ga.
Moet je in je OnTriggerExit bij disableHighlight niet de disableHighlight van de collided object aanroepen? Anders roep je een functie in de controller aan, in plaats van die op je game object. Volgens mij kan je via je collider (coll in dit geval) een aanroep op GameObject doen, door

C#:
1
2
{je gameobject class} go = Collider.gameObject;
go.disableHighlight();


te gebruiken.
In je gameObject kan je dan zoiets doen als:

C#:
1
2
3
public void disableHighlight() {
    this._meshRenderer.material = _oldMaterial;
}


Zo heb je direct zonder door alle instanties heen te moeten hoppen de juiste te pakken en wordt daar de highlight van uitgezet. Tenzij ik je verkeerd begrijp lijkt me dit toch de simpelste oplossing.

Edit: Ik lees nu dat je collided object waarschijnlijk je popup is waar je je "ignore"-button in hebt staan, je zou dat gameobject natuurlijk een referentie naar zijn parent kunnen geven (het gameobject dat ignored moet worden) waardoor je bovenstaande alsnog kan uitvoeren.

[ Voor 6% gewijzigd door Merethil op 09-11-2017 16:34 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij