Script : Interazione tramite sensor ray

Argomento 

In questo articolo aggirerò un problema che ho riscontrato nella creazione della logica con i Mattoni attraverso uno script in Python, ovvero, valorizzare le Property di un singolo oggetto colpito dal Sensor Ray.

Per questo mini tutorial sarà necessario scaricare l’FPS controller.

Applicazione pratica

Questo script nasce dalla necessità di voler implementare una logica di raccolta degli oggetti all’interno della scena da parte del giocatore. Implementando la logica a Mattoni e visualizzando a video le proprietà uguali di oggetti duplicati, ho notato che quando il Sensor Ray colpisce un oggetto, tutte le proprietà presenti nei cloni dello stesso oggetto vengono valorizzate. Per ovviare a questo bug, mi sono cimentato a programmare uno script che dato l’oggetto colpito mi valorizzi solo le sue proprietà, resettandole una volta uscito dal raggio di azione.

Per prima cosa cambia il layout di blender in Scripting 

scripting_1

Come seconda cosa crea un nuovo Script cliccando sul pulsante + nella barra del Text Editor, se non sai come funziona questa finestra puoi dare un’occhiata alla pagina base di Bleder e Python nel paragrafo dedicato all’Editor di testo.

scripting_2

Dato che il mio scopo è quello di fare interagire l’FPS controller con gli oggetti dello scenario, ho chiamato il mio script raycast_interaction spiegato di seguito tramite commenti.

#Cominciamo dicendo allo script di importare 
#i metodi del game engine 
import bge

#Definiamo la funzione principale dello script 
#ovvero quella che sarà eseguita per prima dal 
#loop di gioco
def main():
    
    #Salvo l'ggetto scena corrente 
    #all'interno di una variabile
    currentScene = bge.logic.getCurrentScene()

    #Salvo l'oggetto controller che lancia 
    #lo script all'interno di una variabile 
    cont = bge.logic.getCurrentController()

    #Salvo l'oggetto proprietario del controller all'interno 
    #di una variabile
    own = cont.owner

    #Salvo il Sensor Ray all'interno di una variabile per poi 
    #andare ad identificare l'oggetto colpito tramite 
    #la proprietà hitObject
    sens = cont.sensors['Ray']
    oHit = sens.hitObject

    if sens.positive:
        
    #Testiamo se il Sensor Ray torna un impulso 
    #positivo , allora provvediamo a valorizzare 
    #le proprietà interessate solo all'oggetto 
    #colpito dal ray(e solo se la proprietà esiste)
        
        if "interaction" in oHit:
            oHit['interaction'] = True

    else:

    #Viceversa , se l'impulso torna negativo , 
    #non abbiamo più la possibilità di puntare 
    #direttamente all'oggetto colpito 
    #in precedenza (a meno che non lo si salvi 
    #in un array oppure in un oggetto clone) 
    #quindi cicliamo tutti gli oggetti all'interno 
    #della scena aventi la proprietà interessata , 
    #resettandola
        for obj in currentScene.objects:
            if "interaction" in obj:
                obj['interaction'] = False

main()