Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Renegade« (11.08.2017, 18:37)
Ist eigentlich das Mesh Limit für dynamic Batching immer noch so elend niedrig bei 300 Vertices?
Aktuell benutzen wir für den Background ein prozedural generiertes Material - mein "Grafiker" und ich arbeiten bereits daran, das etwas schicker und gezielter zu gestalten. Vielleicht bringt uns das dann ja tatsächlich etwas Boost.Eine geringere Texturgrösse kann auch einiges an Performance bringen und die Ladezeiten erhöhen. Zu Risiken und Nebenwirkungen reden sie mit ihrem Grafiker und verhauen ihren Programmierer ...
benutzt du bereits Unity 2017?
C#-Quelltext |
|
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerController : MonoBehaviour { public bool facingRight = true; //Using Healthpotions public HealthManager healthManager; public GameObject HealthPotionEffect; //Move [HideInInspector] public float move; [HideInInspector] public float currentSpeed; public float maxSpeed; public float jumpForce; //Footstep-Effects public GameObject FootStepEffect; public GameObject Foots; [SerializeField] private float stepEffectTimer; [SerializeField] private float stepEffectCounter; //Stomping-Effect [SerializeField] private GameObject jumpImpactEffect; //Knockback public float knockbackX; public float knockbackY; public float knockbackLength; public float knockbackCount; [HideInInspector] public bool knockFromRight; //as usual [HideInInspector] public Animator anim; [HideInInspector] public Rigidbody rb; //Grounded? public bool grounded; //On a ladder? [HideInInspector]public bool onLadder; private float climbSpeed; private float currentClimbSpeed; [SerializeField] private float maxClimbSpeed; //modifier for horizontal moving if on ladder or something else [SerializeField] private float runMod; //Range-Attack public Transform firePoint; public GameObject Dagger; private float shotDelay; [SerializeField] private float shotDelayCounter; void Start () { //Set Player in right direction transform.eulerAngles = new Vector3(0, 90, 0); anim = GetComponent<Animator>(); rb = GetComponent<Rigidbody>(); healthManager = FindObjectOfType<HealthManager>(); stepEffectCounter = stepEffectTimer; currentSpeed = maxClimbSpeed; onLadder = false; grounded = true; shotDelay = 0; } void Update() { //Grounded-Animationen setzen if (grounded) anim.SetBool("Ground", grounded); if (!grounded) anim.SetBool("Ground", false); //Run-Animation setzen anim.SetFloat("Speed", Mathf.Abs(move)); //MOVE //Move-Variable erfassen move = Input.GetAxisRaw("Horizontal"); //Footstep-Effects stepEffectCounter -= Time.deltaTime; if (Mathf.Abs(move) >= 0.1 && grounded && stepEffectCounter <=0) { Instantiate(FootStepEffect, Foots.transform.position, Foots.transform.rotation); stepEffectCounter = stepEffectTimer; } //Do Move wenn kein Knockback durch Damage aktiv ist if (knockbackCount <= 0) { rb.velocity = new Vector2(move * currentSpeed, rb.velocity.y); anim.SetBool("Knockback", false); } else //Do if theres is knockback { if (knockFromRight) { anim.SetBool("Knockback",true); rb.velocity = new Vector2(-knockbackX, knockbackY); move = 0.0f; } if (!knockFromRight) { anim.SetBool("Knockback", true); rb.velocity = new Vector2(knockbackX, knockbackY); move = 0.0f; } knockbackCount -= Time.deltaTime; } //Flip Animations if (move > 0 && !facingRight) Flip(); else if (move < 0 && facingRight) Flip(); //JUMP if (grounded && (Input.GetKeyDown(KeyCode.Space) || Input.GetButtonDown("Jump"))) Jump(); //RANGE if ((Input.GetKeyDown(KeyCode.Return) || Input.GetButtonDown("Fire2")) && shotDelay <= 0) Range(); shotDelay -= Time.deltaTime; //MELEE if (Input.GetKeyDown(KeyCode.E) || Input.GetButtonDown("Fire3")) anim.SetTrigger("Melee"); //CLIMB if (onLadder) Climb(); if (!onLadder) ResetClimb(); //USE HEALTH POTION if (((Input.GetKeyDown(KeyCode.H) || Input.GetButtonDown("Potion")) && HealthPotionManager.healthPotions > 0)) { UseHealthPotion(); } } //FUNKTIONEN public void Range() { anim.SetTrigger("Range"); shotDelay = shotDelayCounter; } public void Jump() { anim.SetBool("Ground", false); rb.AddForce(new Vector2(0, jumpForce)); } public void Climb() { //change the player rotation transform.eulerAngles = new Vector3(0, 0, 0); //change the player position transform.position = new Vector3(transform.position.x, transform.position.y, -0.2f); //change scale like in flip function, so the player alway looks to background on a ladder Vector3 theScale = transform.localScale; theScale.x = 0.75f; theScale.z = 0.75f; transform.localScale = theScale; currentClimbSpeed = maxClimbSpeed; //gravity off rb.useGravity = false; //horizontal move reduction if (!grounded) { currentSpeed = runMod; //JUMP ON LADDER if (Input.GetKeyDown(KeyCode.Space) || Input.GetButtonDown("Jump")) { currentSpeed = maxSpeed; rb.useGravity = true; anim.SetBool("Ground", false); rb.AddForce(new Vector2(0, jumpForce)); onLadder = false; currentClimbSpeed = 0; } } if (grounded) { currentSpeed = maxSpeed; } //climbspeed works like horizontal movement climbSpeed = currentClimbSpeed * Input.GetAxisRaw("Vertical"); rb.velocity = new Vector2(rb.velocity.x, climbSpeed); // OnLadder-Anim anim.SetBool("OnLadder", true); //Climbing-Anim anim.SetFloat("climbSpeed", Mathf.Abs(climbSpeed)); } public void ResetClimb() { transform.position = new Vector3(transform.position.x, transform.position.y, 0); if (facingRight) { Vector3 theScale = transform.localScale; theScale.x = 0.75f; theScale.z = 0.75f; transform.localScale = theScale; } if (!facingRight) { Vector3 theScale = transform.localScale; theScale.x = -0.75f; theScale.z = -0.75f; transform.localScale = theScale; } //set the player rotation back transform.eulerAngles = new Vector3(0, 90, 0); currentSpeed = maxSpeed; //just to be sure, climbspeed equals zero currentClimbSpeed = 0; //gravity on rb.useGravity = true; anim.SetBool("OnLadder", false); anim.SetFloat("climbSpeed", 0); } public void Flip() { if (!onLadder) { facingRight = !facingRight; Vector3 theScale = transform.localScale; theScale.x *= -1; theScale.z *= -1; transform.localScale = theScale; } } //Animation-Event: Stomping on ground after jumping/falling public void StompingOnGround() { Instantiate(jumpImpactEffect, Foots.transform.position, Foots.transform.rotation); } //Animation-Event: Instantiate Dagger and throw it at the right time of animation public void ThrowDagger() { Instantiate(Dagger, firePoint.position, firePoint.rotation); } public void UseHealthPotion() { HealthPotionManager.AddHealthPotions(-1); healthManager.AddhealthPoints(100); Instantiate(HealthPotionEffect, transform.position, transform.rotation); } //let the player move with a platform (make the parent of the player the moving platform, so that it inherits the platforms movement) private void OnTriggerStay(Collider other) { if (other.transform.tag == "MovingPlatform") { //inherit movement transform.parent = other.transform; //if player moves or jump stop inheriting if ((Input.GetKeyDown(KeyCode.Space) || Input.GetButtonDown("Jump")) || Mathf.Abs(move) >= 0.1) { transform.parent = null; } } } private void OnTriggerExit(Collider other) { if (other.transform.tag == "MovingPlatform") { transform.parent = null; } } } |
Zitat
äh ... ? Sorry, kann ich nicht beantworten. Ich hab' jetzt nicht jeden Aspekt der Frage verstanden, dafür hab' ich wohl noch zu viel Grün hinter den Ohren.
Das macht Unity eigentlich automatisch wenn ich mich noch recht erinnere.
C#-Quelltext |
|
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 32 33 34 35 |
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; public class LevelLoader : MonoBehaviour { public string levelToLoad; void Start() { //start a coroutine that will load the desired scene. StartCoroutine(LoadNewScene()); } // The coroutine runs on its own at the same time as Update() and takes an integer indicating which scene to load. IEnumerator LoadNewScene() { // Start an asynchronous operation to load the scene that was passed to the LoadNewScene coroutine. AsyncOperation async = SceneManager.LoadSceneAsync(levelToLoad); // While the asynchronous operation to load the new scene is not yet complete, continue waiting until it's done. while (!async.isDone) { yield return null; } } } |
Zitat
Ich benutze zwischen den Leveln jeweils eine Scene als "Loader", weil ich will, dass alles fertig geladen ist, bevor der Spieler den ersten Schritt im Folgelevel macht. Nun habe ich durch das Lightmapping und die vielen statischen Objekte ja recht viel zum Laden, da weniger während der Laufzeit berechnet wird. Das Gerüst des Skripts, das ich in dieser Lade-Szene benutze, hatte ich einst aus einem Unity-Forum. Möglicherweise kann es daran liegen?
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Tiles« (12.08.2017, 09:41)
C#-Quelltext |
|
1 2 |
//mischt die weitereSzene mit in die aktuell geladene, sprich additive LoadSceneAsync("weitereSzene", LoadSceneMode.Additive); |
C#-Quelltext |
|
1 2 3 4 5 6 7 |
public class LevelLoader : MonoBehaviour { public string levelToLoad; IEnumerator Start() { yield return SceneManager.LoadSceneAsync(levelToLoad); } } |
Das von dir gezeigte Beispielskript zum Laden von Szenen kann vereinfacht werden, denn Start Methoden können bereits für sich selbst als CoRoutine behandelt werden:
Werbeanzeige