Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Jak usunąć odbicie tła w Unity 3D?


Rekomendowane odpowiedzi

Opublikowano

Pobrałem sobie ze sklepu unity Unity Project 2D platformer. To ta strzelająca fasolka. Chciałem to sobie przerobić aby "poćwiczyć". Jednak jak przenoszę tło aby podążało za bohaterem to idąc w np prawą a później jak chce skręcić w lewo to mi się tworzy takie jakby odbicie tła. Jak to usunąć? ;) Chciałbym aby tło czyli ta rzeka i te miasto cały czas stało w miejscu. 

Opublikowano

Jeżeli w tym projekcie ustawiłeś "hero" jako parent tła, to problem wynika z tej metody w PlayerControl.cs:
 

	void Flip ()
	{
		// Switch the way the player is labelled as facing.
		facingRight = !facingRight;

		// Multiply the player's x local scale by -1.
		Vector3 theScale = transform.localScale;
		theScale.x *= -1;
		transform.localScale = theScale;
	}

Dzięki temu wystarczy tylko jeden zestaw sprajtów (w tym wypadku wszystkie skierowane są w jedną stronę). Jeśli idziesz w lewo, wywołuje się ta metoda i odwraca skalę x na przeciwną.

 

Żeby tło w pewnym sensie podążało za graczem, możesz spróbować wsadzić "backgrounds" jako child "mainCamera".

Opublikowano

Jeżeli w tym projekcie ustawiłeś "hero" jako parent tła, to problem wynika z tej metody w PlayerControl.cs:

 

	void Flip ()
	{
		// Switch the way the player is labelled as facing.
		facingRight = !facingRight;

		// Multiply the player's x local scale by -1.
		Vector3 theScale = transform.localScale;
		theScale.x *= -1;
		transform.localScale = theScale;
	}

Dzięki temu wystarczy tylko jeden zestaw sprajtów (w tym wypadku wszystkie skierowane są w jedną stronę). Jeśli idziesz w lewo, wywołuje się ta metoda i odwraca skalę x na przeciwną.

 

Żeby tło w pewnym sensie podążało za graczem, możesz spróbować wsadzić "backgrounds" jako child "mainCamera".

 Niby jak wstawie backgrounds jako child w maincamera to jest wszystko ładnie prócz tej wody. bo jest tak jakby że jak postać spada to woda od niej ucieka (chyba) ;/

Opublikowano

No to przenieś do kamery tylko te elementy, które chcesz żeby były w miejscu. env_RiverBase, env_RiverTop i RiverMid zostaw tam gdzie były wcześniej :D

Opublikowano

No to przenieś do kamery tylko te elementy, które chcesz żeby były w miejscu. env_RiverBase, env_RiverTop i RiverMid zostaw tam gdzie były wcześniej :D

No tak, wpadłem na to.. Ale wtedy np jak poszerzę plansze... To fasolka nie wpada do wody tylko spada cały czas w dół.. ;P 

Co odpowiada za te wpadanie do wody? ;P 

 

ok już mam. ;P

 

@edit.. A da się zrobić tak aby background poruszał się w lewo i w prawo ale nie w górę i w dół? ;P

Opublikowano

Za umieranie odpowiada killtrigger. Jeżeli chcesz żeby tło poruszało się za graczem tylko w lewo/prawo to już nie powinieneś ustawiać parenta który się rusza. Wtedy możesz zrobić np. skrypt, który transform.position.x tła ustawi na transform.position.x kamery.
 

using UnityEngine;
using System.Collections;

public class poruszajacesietlo : MonoBehaviour {
	private Transform _kamera;
	// Use this for initialization
	void Start () {
		_kamera = GameObject.FindGameObjectWithTag("MainCamera").transform;
	}
	
	// Update is called once per frame
	void Update () {
		this.transform.position = new Vector3(_kamera.position.x,0,0);
	}
}

Jeżeli chcesz zupełnie statyczne tło, to możesz to rozegrać na dwie kamery. Jedna wyświetla to co się faktycznie dzieje, a druga wyświetla tylko tło.

Opublikowano

wielkie dzięki ale zrobiłem to trochę inaczej. wszystko od "river" ustawiłem pod backgrounds a całą resztę wsadziłem pod maincamera i po prostu ustawiłem aby się nie odchylała wzgledem osi y. ;)

 

 

@edit. Taki jeszcze jeden problem. Jak zrobić aby "enemy" chodziły w różnym kierunku? Bo chodzą mi tylko w prawo. ;/

Opublikowano

Z tego co widzę w Enemy.cs przy FixedUpdate() to muszą trafić na przeszkode w postaci Collider2D.

Opublikowano

Z tego co widzę w Enemy.cs przy FixedUpdate() to muszą trafić na przeszkode w postaci Collider2D.

 To akurat wiem. Ale chodzi mi o to jak zrobić aby losowo wybierało kierunek? I jeszcze jedno.. Czemu jak wstawiam cylinder (chce coś zrobić na wzór monety) i włączę gre to jest czarne koło, nawet jak na cylindrze jest ustawiony jakiś obrazek/kolor?  :unsure:

Opublikowano

Żeby na starcie przeciwnicy ruszali w różne strony, możesz dodać void Start(), a w nim:
 

if(Random.value > .5f)
Flip();

W tym momencie jest 50% szans, że to będzie prawdą i wywoła Flip().

 

 

Co do cylindra - w projektach 2D zazwyczaj nie ma directional light, spróbuj zmienić shader który dajesz na ten obiekt. Ewentualnie narysuj monetę i wrzuć jako Sprite :D

Opublikowano

Żeby na starcie przeciwnicy ruszali w różne strony, możesz dodać void Start(), a w nim:

 

if(Random.value > .5f)
Flip();

W tym momencie jest 50% szans, że to będzie prawdą i wywoła Flip().

 

 

Co do cylindra - w projektach 2D zazwyczaj nie ma directional light, spróbuj zmienić shader który dajesz na ten obiekt. Ewentualnie narysuj monetę i wrzuć jako Sprite :D

 

co do przeciwników i losowego ruszania... To jak dodam to do enemy.cs (jeśli tu miałem dodać) to jest tak że ruszają tylko w w lewo. ;D Czyli przeciwnie niż powinny. I cały czas spawnują się w lewo.. ;/ A co do cylindra, jak dodałem światło to jest wszystko okej. ;) Ale zrobię to chyba jako sprite. :)

Opublikowano

No to teraz już nie wiem, czy mają startować losowo czy wszyscy w prawo.
Domyślnie w tym projekcie wszyscy spawnują się i idą w prawo. Jeżeli przy starcie zrobisz Flip() to wtedy startują w lewo. Jeżeli nie chcesz żeby to było 50/50, możesz zrobić to mniej więcej procentowo.
if(Random.Range(0.0f,10.0f) < 7.5f) to jest 75% szans na wylosowanie tego, żeby zrobili Flip() i startowali w lewo.

Opublikowano

No to teraz już nie wiem, czy mają startować losowo czy wszyscy w prawo.

Domyślnie w tym projekcie wszyscy spawnują się i idą w prawo. Jeżeli przy starcie zrobisz Flip() to wtedy startują w lewo. Jeżeli nie chcesz żeby to było 50/50, możesz zrobić to mniej więcej procentowo.

if(Random.Range(0.0f,10.0f) < 7.5f) to jest 75% szans na wylosowanie tego, żeby zrobili Flip() i startowali w lewo.

 Chciałbym aby startowali losowo. Ale na takiej zasadzie że jeden z danego spawnera np. idzie w prawo, a drugi już w lewo. 

 

Edit... Okej, działa. Nie wiem co przedtem robiłem źle. A kolejna sprawa.. Czemu nie działa mi niszczenie monet przy kolizji.? 

Dodałem skrypt:

 

#pragma strict

var moneta : GameObject;

function OnTriggerEnter()
	{
	Destroy(moneta);
	}
	
function Update() {

}

przypisałem go do mojej monety, ustawiłem gameobject (tą samą monete) i przy kolizji z postacią nie znika..;/

Opublikowano

Ogólnie unikam javascriptu, więc podpowiem Ci na przykładzie C#.
 

void OnTriggerEnter2D(Collider2D other)
{
    if(other.CompareTag("Powerup")
    {
        Destroy(other.gameObject);
    }
}

Lepiej kiedy będziesz miał Sprite z collider2D. Szczerze mówiąc, to nigdy nie robiłem tak żeby do projektu 2D dodawać kule, albo sześciany. 

Twój błąd polega na:
Pisaniu w JavaScript :D W połączeniu z C#. Żeby wszystko działało, to musisz wrzucić je do odpowiednich folderów. W unity C# kompiluje się przed JS i Boo. Więc jeśli chcesz mieć w C# odwołanie do JS to są jajca.

Nie mam pewności, czy zaznaczyłeś ją w inspektorze, chociaż to i tak słabe podejście. Wyobraź sobie sytuację, w której na scenie masz miliony monet. Tak jak teraz to robisz, musiałbyś pakować je do tablicy/listy.

Zapomniałeś o parametrze przy OnTriggerEnter. Ta metoda przyjmuje collider. W większości przykładów nazywany "other". No i jak już w ten "other" wpadniesz to sprawdzasz jego tag/nazwę/whateva. Ja zazwyczaj sprawdzam tag. Jeżeli jest taki jak planuję, to niszczę "other". W międzyczasie możesz zrobić jeszcze "piniundze++;".

 

 

edit:
Tak właściwie to nie ma co odstawiać prywaty w temacie dotyczącym tła za postacią, który przerodził się w spawnowanie przeciwników po czym ewoluował w zbieranie monet. Zapraszam na PW.

drugi edit:
mój błąd - other.gameObject zamiast this.gameObject.

Opublikowano

Ogólnie unikam javascriptu, więc podpowiem Ci na przykładzie C#.

 

void OnTriggerEnter2D(Collider2D other)
{
    if(other.CompareTag("Powerup")
    {
        Destroy(this.gameObject);
    }
}

Lepiej kiedy będziesz miał Sprite z collider2D. Szczerze mówiąc, to nigdy nie robiłem tak żeby do projektu 2D dodawać kule, albo sześciany. 

Twój błąd polega na:

Pisaniu w JavaScript :D W połączeniu z C#. Żeby wszystko działało, to musisz wrzucić je do odpowiednich folderów. W unity C# kompiluje się przed JS i Boo. Więc jeśli chcesz mieć w C# odwołanie do JS to są jajca.

Nie mam pewności, czy zaznaczyłeś ją w inspektorze, chociaż to i tak słabe podejście. Wyobraź sobie sytuację, w której na scenie masz miliony monet. Tak jak teraz to robisz, musiałbyś pakować je do tablicy/listy.

Zapomniałeś o parametrze przy OnTriggerEnter. Ta metoda przyjmuje collider. W większości przykładów nazywany "other". No i jak już w ten "other" wpadniesz to sprawdzasz jego tag/nazwę/whateva. Ja zazwyczaj sprawdzam tag. Jeżeli jest taki jak planuję, to niszczę "other". W międzyczasie możesz zrobić jeszcze "piniundze++;".

 

 

edit:

Tak właściwie to nie ma co odstawiać prywaty w temacie dotyczącym tła za postacią, który przerodził się w spawnowanie przeciwników po czym ewoluował w zbieranie monet. Zapraszam na PW.

Czyli muszę zrobić monetę w Sprite i później dodać skrypt w c#? ;D Już bawię się z monetą.. ;P Jesteś wielki, wiesz? xD Dzięki za pomoc. ;P

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...