Jump to content
Unity Insider Forum

Leaderboard


Popular Content

Showing content with the highest reputation on 06/26/2020 in all areas

  1. 1 point
    Ich hab mal noch einen Highlight-Shader eingebunden und damit jeder was davon hat kommt es hier in den Thread. Der Shader ist nicht ganz perfekt aber dafür kostenlos und man muss kein Postprocessing betreiben (was mehr Performance kostet) um das Gleiche zu erreichen. Damit man nicht den Unity-Standardshader anpassen muss verwende ich hier einfach 2 Materials für den gleichen Mesh. Das 1. Material rendert den Mesh und das 2. Material rendert die Outline um den Mesh. Man könnte das ganze auch in einen Shader packen, aber sobald sich der Unity-Standardshader ändert muss man diese Code wieder nachziehen. Die Klasse Selectable muss entsprechend angepasst werden um diesen Shader zu verwenden: using System.Collections; using System.Collections.Generic; using UnityEngine; public class Selectable : MonoBehaviour { public Material defaultMaterial; public Material highlightMaterial; public float maxDistanceCamera = 10f; public float outLineWitdh = 0.0005f; private Camera m_Camera; private SelectionManager m_SelectionManager; private Renderer m_Renderer; private Transform originalParent; private Vector3 originalPosition; private Quaternion originalRotation; private Material originalMaterial; private float distanceToCamera; // Start is called before the first frame update void Start() { originalParent = this.transform.parent; originalPosition = this.transform.position; originalRotation = this.transform.rotation; m_SelectionManager = GameObject.FindObjectOfType<SelectionManager>(); m_Renderer = this.GetComponentInChildren<Renderer>(); m_Camera = GameObject.FindObjectOfType<Camera>(); originalMaterial = m_Renderer.material; } public void Reset() { this.transform.parent = originalParent; this.transform.position = originalPosition; this.transform.rotation = originalRotation; m_Renderer.material = defaultMaterial; m_SelectionManager.CurrentSelection = null; } void OnMouseDown() { distanceToCamera = (transform.position - m_Camera.transform.position).magnitude; if (distanceToCamera < maxDistanceCamera) { m_SelectionManager.CurrentSelection = this.gameObject; this.transform.parent = m_SelectionManager.SelectableHandle; this.transform.localPosition = Vector3.zero; } } //If your mouse hovers over the GameObject void OnMouseOver() { distanceToCamera = (transform.position - m_Camera.transform.position).magnitude; if (distanceToCamera < maxDistanceCamera) { //m_Renderer.material = highlightMaterial; Material[] materials = m_Renderer.materials; materials = new Material[2]; materials[0] = highlightMaterial; materials[0].SetFloat("_Outline", outLineWitdh); materials[1] = originalMaterial; m_Renderer.materials = materials; } } //The mouse is no longer hovering over the GameObject void OnMouseExit() { //m_Renderer.material = defaultMaterial; Material[] materials = new Material[1]; materials[0] = originalMaterial; m_Renderer.materials = materials; } } Das Selectable-Skript bekommt nun ein Material mit diesem Shader zugewiesen: Das Ergebnis sieht dann so aus: Für jedes Mesh muss leider separat die Dicke der Outline eingestellt werden, so hat z.B. die Vase eine Dicke von 0.01 und die Figur rechts daneben 0.0005. Der Shader ist im Anhang. Silhouette Only.shader
  2. 1 point
    So ich hab mich mal dran gemacht, das Rotieren war der "schwerste Part": - es gibt nun eine neue Klasse und die muss an jedes GO gehangen werden welches man "aufheben" können soll (die GOs heißen bei dir "default") - jedes Selectable GO braucht einen Collider (z.b. Box-Collider) - der "SelectionManager" ist nun nur noch für die Steuerung zuständig, detektiert nicht mehr und ändert auch den Renderer der Selectable GOs nicht mehr. - mit ALT kann der Mauscursor eingeschaltet werden und damit kann der Spieler nun das Objekt mit dem Mauszeiger anklicken oder markieren - bei LMB wird das Objekt an den Spieler herangezogen (in das Pivot GO das unter dem Rigidbody liegen sollte - siehe unten) - mit der Maus kann das Object nun rotiert werden, dabei werden die Kamera-Achsen als Rotations-Achsen genommen - drückt der Spieler LMB noch einmal wird das Objekt zurückgelegt und der Spieler kann sich wieder frei bewegen - der Controller wird während der Aktionen entsprechend deaktiviert - die Kameradistanz bis zu welcher die Objekte selektierbar sein dürfen kann eingestellt werden Wichtig ist noch folgendes: Alle GOs die man aufheben können soll müssen nun die Selectable Klasse bekommen! Alle GOs die Selectable sein sollen dürfen nicht mehr static sein! Unter dem Rigidbody liegt nun ein Pivot-Objekt, in welches die Selectable-Objekte gezogen werden. Dieses GO muss dem SelectionManager Skript zugewiesen werden (siehe entsprechender Slot). using System.Collections; using System.Collections.Generic; using UnityEngine; public class Selectable : MonoBehaviour { public Material defaultMaterial; public Material highlightMaterial; public float maxDistanceCamera = 10f; private Camera m_Camera; private SelectionManager m_SelectionManager; private Renderer m_Renderer; private Transform originalParent; private Vector3 originalPosition; private Quaternion originalRotation; private float distanceToCamera; // Start is called before the first frame update void Start() { originalParent = this.transform.parent; originalPosition = this.transform.position; originalRotation = this.transform.rotation; m_SelectionManager = GameObject.FindObjectOfType<SelectionManager>(); m_Renderer = this.GetComponentInChildren<Renderer>(); m_Camera = GameObject.FindObjectOfType<Camera>(); } public void Reset() { this.transform.parent = originalParent; this.transform.position = originalPosition; this.transform.rotation = originalRotation; m_Renderer.material = defaultMaterial; m_SelectionManager.CurrentSelection = null; } void OnMouseDown() { distanceToCamera = (transform.position - m_Camera.transform.position).magnitude; if (distanceToCamera < maxDistanceCamera) { m_SelectionManager.CurrentSelection = this.gameObject; this.transform.parent = m_SelectionManager.SelectableHandle; this.transform.localPosition = Vector3.zero; } } //If your mouse hovers over the GameObject void OnMouseOver() { distanceToCamera = (transform.position - m_Camera.transform.position).magnitude; if (distanceToCamera < maxDistanceCamera) { m_Renderer.material = highlightMaterial; } } //The mouse is no longer hovering over the GameObject void OnMouseExit() { m_Renderer.material = defaultMaterial; } } using System.Collections; using System.Collections.Generic; using UnityEngine; public class SelectionManager : MonoBehaviour { public Transform SelectableHandle; [HideInInspector] public GameObject CurrentSelection; private FirstPersonController firstPersonController; private Camera m_Camera; private int leftMBCounter = 0; private void Start() { m_Camera = GameObject.FindObjectOfType<Camera>(); firstPersonController = GameObject.FindObjectOfType<FirstPersonController>(); if (SelectableHandle == null) { Debug.LogWarning("Bitte ein leeres Container-Gameobjekt für die Positionierung eines Selectable unter dem Rigidbody anlegen."); Debug.LogWarning("Es wird ein default Container-Gameobjekt erzeugt."); GameObject selectableHandle = new GameObject(); selectableHandle.name = "SelectableHandle"; selectableHandle.transform.parent = firstPersonController.transform; selectableHandle.transform.localPosition = new Vector3(0, 1.3f, 1.3f); SelectableHandle = selectableHandle.transform; } } // Update is called once per frame private void Update() { if (Input.GetKeyDown(KeyCode.LeftAlt) && CurrentSelection == null) { firstPersonController.enabled = false; Cursor.visible = true; //Cursor.lockState = CursorLockMode.Confined; Cursor.lockState = CursorLockMode.None; } if (Input.GetKeyUp(KeyCode.LeftAlt) && CurrentSelection == null) { firstPersonController.enabled = true; } if (Input.GetMouseButtonDown(0) && CurrentSelection!= null) { leftMBCounter++; // Hide mouse cursor Cursor.visible = false; Cursor.lockState = CursorLockMode.Locked; // Prevent player from moving around firstPersonController.enabled = false; if (leftMBCounter > 1) { CurrentSelection.GetComponent<Selectable>().Reset(); // Unlock the player so he can move around again firstPersonController.enabled = true; leftMBCounter = 0; // Clear the selection CurrentSelection = null; } } if (CurrentSelection != null) { RotateObject(); } } public void RotateObject() { float InputX = Input.GetAxis("Mouse X"); float InputY = Input.GetAxis("Mouse Y"); CurrentSelection.transform.RotateAround(CurrentSelection.transform.position, m_Camera.transform.up, InputX * 550f * Time.deltaTime); CurrentSelection.transform.RotateAround(CurrentSelection.transform.position, m_Camera.transform.right, InputY * 550f * Time.deltaTime); } } Bekannte Probleme: Wenn der Spieler sehr dicht an einem Tisch steht, dann collidiert der Collider des Objektes mit dem Collider des Tisches.

Announcements

Hy, wir programmieren für dich Apps(Android & iOS):

Weiterleitung zum Entwickler "daubit"



×
×
  • Create New...