Modificați culoarea sau transparența unui obiect

Bună ziua. Într-o formă sau alta, această întrebare a fost deja cerut să forume.No, din păcate, pentru mine și nu a fost aprobată. Sarcina este după cum urmează: - în scenă câteva obiecte (plasa de încorporat Prefab), 10-20sht (unele nested). Trebuie să faceți clic pe mouse sau să le ascundeți selectiv. Sau (care este mult mai bine.) Modificați materialul (sau o mai mare transparență) a obiectului. Până când ischeznoveniya.Odin click selecție (obiect de iluminat), un al doilea clic 50% transparență, iar al treilea faceți clic pe vidimost.Nu zero și de dorit să fie capabil să se întoarcă vizibilitatea tuturor obiectelor, astfel, ascunse.






Acum am pe camera mea să se rotească în jurul acestui grup este agățat script-ul găsit în rețea:

# 91; AddComponentMenu # 40; "Camera-Control / Stilul camerei 3dsMax" # 41; # 93;

clasa publica maxCamera. MonoBehaviour

obiectiv public de transformare;

public Vector3 targetOffset;

distanța publică a flotorului = 5.0f;

float public maxDistance = 20;

float public minDistance = .6f;

float public xSpeed ​​= 200.0f;

float public ySpeed ​​= 200.0f;

public int yMinLimit = - 80;

public int yMaxLimit = 80;

public int zoomRate = 40;

float public panSpeed ​​= 0.3f;

float public zoomDampening = 5.0f;

float privat xDeg = 0.0f;

float privat yDeg = 0.0f;

curenții de flotare private;

flotorul privat doritDistanță;

private Quaternion currentRotation;

private Quaternion wantedRotation;

Rotația Quaternion privată;

poziția Vector3 privată;

void Start # 40; # 41; # 123; init # 40; # 41; ; # 125;

void OnEnable # 40; # 41; # 123; init # 40; # 41; ; # 125;

public void Init # 40; # 41;

// Dacă nu există nici o țintă, creați o țintă temporară la distanța de la punctul de vedere curent al camerelor

dacă # 40; țintă # 41;

GameObject go = nou jocObject # 40; "Target Cam" # 41; ;

du-te. transformare. pozitie = transformare. poziția + # 40; transformare. înainte * distanță # 41; ;

țintă = du-te. transformare;

distanta = Vector3. distanță # 40; transformare. poziție. țintă. poziție # 41; ;

// asigurați-vă că ați luat rotațiile curente ca puncte de plecare.

pozitie = transformare. poziție;

rotație = transformare. rotație;

currentRotation = transformă. rotație;

dorităRotare = transformare. rotație;

xDeg = Vector3. unghi # 40; Vector3. dreapta. transformare. dreapta # 41; ;

yDeg = Vector3. unghi # 40; Vector3. în sus. transformare. în sus # 41; ;

* Logica camerei pe LateUpdate se actualizează numai după ce a fost manipulată toată logica de mișcare a caracterelor.

void LateUpdate # 40; # 41;

// Dacă butonul Control și Alt și Mijloc? ZOOM!

dacă # 40; Intrare. GetMouseButton # 40; 1 # 41; # 41;

dorităDistanță - = Intrare. GetAxis # 40; "Mouse X" # 41; * Timpul. deltaTime * zoomRate * 0.125f * Mathf. Abs # 40; desiredDistance # 41; ;

// Dacă sunt selectate mouse-ul și stânga mijlocie? ORBIT

altfel dacă # 40; Intrare. GetMouseButton # 40; 0 # 41; # 41;

xDeg + = Intrare. GetAxis # 40; "Mouse X" # 41; * xSpeed ​​* 0,02f;

yDeg - = Intrare. GetAxis # 40; "Mouse Y" # 41; * ySpeed ​​* 0.02f;







// Fixați axa verticală pentru orbită

yDeg = ClampAngle # 40; yDeg, yMinLimit, yMaxLimit # 41; ;

// setați rotirea camerei

dorităRotare = Quaternion. Euler # 40; yDeg, xDeg, 0 # 41; ;

currentRotation = transformă. rotație;

rotație = Quaternion. Lerp # 40; curentRotare, dorităRotare, Timp. deltaTime * zoomDampening # 41; ;

transformare. rotație = rotație;

// altfel dacă se selectează mouse-ul de mijloc, aplecăm prin transformarea țintei în spațiul de ecran

altfel dacă # 40; Intrare. GetMouseButton # 40; 2 # 41; # 41;

/ / apuca rotația camerei pentru a putea să ne mișcăm într-un spațiu XY local

țintă. rotație = transformare. rotație;

țintă. traduce # 40; Vector3. dreapta * - Intrare. GetAxis # 40; "Mouse X" # 41; * panSpeed # 41; ;

țintă. traduce # 40; transformare. sus * - Intrare. GetAxis # 40; "Mouse Y" # 41; * panSpeed, Space. lume # 41; ;

// afectați distanța de Zoom dorită dacă rotiți rotița de derulare

dorităDistanță - = Intrare. GetAxis # 40; "Mouse ScrollWheel" # 41; * Timpul. deltaTime * zoomRate * Mathf. Abs # 40; desiredDistance # 41; ;

/ / fixați min. / max

desiredDistance = Mathf. clemă # 40; doritDistanță, minDistanță, maxDistanță # 41; ;

// Pentru netezirea zoom-ului, distanta lerp

currentDistance = Mathf. Lerp # 40; curentDistanță, dorităDistanță, Timp. deltaTime * zoomDampening # 41; ;

// calculați poziția pe baza noii rezistențe actuale

position = target. poziție - # 40; rotație * Vector3. înainte * curentDistanță + targetOffset # 41; ;

transformare. pozitie = pozitie;

static plutitor privat ClampAngle # 40; unghi de plutire, min. plutitor, plutitor max # 41;

dacă # 40; unghi <- 360 )

dacă # 40; unghi> 360 # 41;

returnează Mathf. clemă # 40; unghi, min, max # 41; ;


Deoarece sunt foarte slab (sau deloc deloc). Înțeleg programarea, eu nu pot să-l stăpânesc singur. Singurul lucru pe care l-am înțeles prin căutarea în forum - e mai bine să o faci prin Raycast.
Mai degrabă să atârnă un script pe fiecare plasă.
Spune-mi ce direcție să săpăm. Sau deja există unele soluții gata făcute.
Poate că va fi suficient să completeze scenariul care deja cântărește camera și acum o controlează.

Am găsit codul ăsta

public DebugScript de clasă. MonoBehaviour # 123;
bool privat _debug = adevărat;
void Update # 40; # 41;
# 123;
dacă # 40; Intrare. GetMouseButtonUp # 40; 0 # 41; # 41;
# 123;
Ray ray = Camera. principal. ScreenPointToRay # 40; Intrare. mousePosition # 41; ;
RaycastHit lovit;
dacă # 40; Fizică. Raycast # 40; ray, afară, 100 # 41; # 41;
# 123;
dacă # 40; _DEBUG # 41; Debug. DrawLine # 40; ray. origine. lovit. punct # 41; ;
dacă # 40; lovit. Collider. gameObject. tag == "MyTag" # 41;
lovit. Collider. gameObject. renderer. materiale. culoare = Culoare. verde;
# 125;
# 125;
# 125;
# 125;

Dar Unity jură la linia:

Ray ray = Camera. principal. ScreenPointToRay # 40; Intrare. mousePosition # 41; ;

NullReferenceException
UnityEngine.Camera.ScreenPointToRay (poziția Vector3) (la C: /BuildAgent/work/842f9557127e852/Runtime/ExportGenerated/Editor/UnityEngineCamera.cs: 267)

din păcate, nu înseamnă nimic pentru mine
example.Update () (la Assets / example.cs: 10)

Poate pentru că codul a fost scris sub o versiune anterioară a Unității. Acum am versiunea 3.4

acum, de asemenea) Dar nu a existat suficientă coliziune la unitate. A câștigat deja. Mulțumesc foarte mult.
Acum, pentru completitudinea sarcinii inițiale, veți afla, de asemenea, cum să dezactivați selecția de la obiectul selectat anterior atunci când este selectată următoarea. includeți transparența obiectelor, ascundeți-le și, de preferat, dezvăluiți-le pe toate.
Poate, folosind același script, dar adăugându-l?

M-am alaturat cursului de programare + html!


Sunt mai potrivită pentru simplitate și funcționează, dar nu găsesc cum să returnez materialul sursă. De asemenea, nu puteți returna materialul original și utilizând:

public DebugScript de clasă. MonoBehaviour # 123;
bool privat _debug = adevărat;
void Update # 40; # 41;
# 123;
dacă # 40; Intrare. GetMouseButtonUp # 40; 0 # 41; # 41;
# 123;
Ray ray = Camera. principal. ScreenPointToRay # 40; Intrare. mousePosition # 41; ;
RaycastHit lovit;
dacă # 40; Fizică. Raycast # 40; ray, afară, 100 # 41; # 41;
# 123;
dacă # 40; _DEBUG # 41; Debug. DrawLine # 40; ray. origine. lovit. punct # 41; ;
dacă # 40; lovit. Collider. gameObject. tag == "MyTag" # 41;
lovit. Collider. gameObject. renderer. materiale. culoare = Culoare. verde;
# 125;
# 125;
# 125;
# 125;

Această opțiune este mai convenabilă, deoarece nu este necesar să închideți un script pe fiecare plasă.







Trimiteți-le prietenilor: