Pue eso. ¿Como hago que las colisiones sean mas eficiente? este es mi script
using UnityEngine;
using System.Collections;
public class ColisionPlayer: MonoBehaviour
{
public float sinkSpeed = 0.5f;
public LayerMask LayerCol;
AudioSource GolpeSonido;
public ParticleSystem particulas;
Player player;
Ray GolpeRay;
RaycastHit GolpeHit;
void Start()
{
GolpeSonido = GetComponentInParent<AudioSource>();
player = GetComponentInParent<Player>();
}
void OnTriggerEnter(Collider colision)
{
GolpeRay.origin = transform.position;
GolpeRay.direction = transform.forward;
if (Physics.Raycast(GolpeRay, out GolpeHit, LayerCol) && colision.gameObject.CompareTag("Enemigo"))
{
vidaAI vidaAi = GolpeHit.collider.GetComponent<vidaAI>();
if (vidaAi != null)
vidaAi.QuitarVIdaAI(20, GolpeHit.point);
GolpeSonido.Play();
Player.damaged = true;
particulas.transform.position = GolpeHit.point;
particulas.Play();
StartCoroutine(SliderEnemigoTrue());
}
}
IEnumerator SliderEnemigoTrue()
{
yield return new WaitForSeconds(0.0f);
player.sliderAI.gameObject.SetActive(true);
yield return new WaitForSeconds(3f);
player.sliderAI.gameObject.SetActive(false);
yield return null;
}
}
Este otro es el del player.
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class Player : MonoBehaviour {
public Animator Anim;
private float correr;
public float speed = 2f;
public float speed2 = 6f;
public float gravity = 20.0F;
public Slider sliderAI;
public float jumpSpeed = 1.0F;
public Image damageImage;
public Slider playerSlider;
public static bool damaged;
public float flashSpeed = 5f;
public int Salto = 2;
public Color flashColour = new Color(1f, 0f, 0f, 0.1f);
Vector3 moveDirection = Vector3.zero;
public SphereCollider colisionplayerPuno;
public SphereCollider colisionplayerPata;
public GameObject colisionAI;
void Awake()
{
sliderAI.gameObject.SetActive(false);
}
void Start ()
{
colisionAI.GetComponentInChildren<ColisionPlayerAI>();
if (colisionAI != null) { }
Anim = GetComponent<Animator>();
}
// Update is called once per frame
void Update () {
if (damaged)
{
damageImage.color = flashColour;
}
else
{
damageImage.color = Color.Lerp(damageImage.color, Color.clear, flashSpeed * Time.deltaTime);
}
damaged = false;
sliderAI.value = vidaAI.vida_AI;
playerSlider.value = vidaPlayer.vida;
transform.Translate(0, 0, (Input.GetAxisRaw("Vertical")) * speed * Time.deltaTime, Space.World);
transform.Translate((Input.GetAxisRaw("Horizontal")) * speed * Time.deltaTime, 0, 0);
Anim.SetFloat("andar", Input.GetAxis("Horizontal"));
Anim.SetFloat("andar", Input.GetAxis("Vertical"));
Anim.SetFloat("correr", correr);
if (Input.GetAxis("Horizontal") == -1)
{
Anim.SetFloat("andar", 2f);
}
if (Input.GetAxis("Horizontal") == 1)
{
Anim.SetFloat("andar", 2f);
}
if (Input.GetAxis("Vertical") == -1)
{
Anim.SetFloat("andar", 2f);
}
if (Input.GetButton("Jump"))
{
transform.Translate(0, 1, 3 * speed * Time.deltaTime);
Anim.SetBool("salto", true);
}
else
{
Anim.SetBool("salto", false);
}
if (Input.GetButton("Fire3"))
{
correr = 0.2f;
transform.Translate(0, 0, (Input.GetAxisRaw("Vertical")) * speed2 * Time.deltaTime, Space.World);
}
else
{
correr = 0.0f;
}
CharacterController controller = GetComponent<CharacterController>();
moveDirection.y -= gravity * Time.deltaTime;
controller.Move(moveDirection * 10 * Time.deltaTime);
Golpes();
}
public void Golpes()
{
if (Input.GetButton("Fire2"))
{
Anim.SetBool("patada", true);
colisionplayerPata.isTrigger = true;
}
else
{
Anim.SetBool("patada", false);
colisionplayerPata.isTrigger = false;
}
if (Input.GetButton("Fire1"))
{
Anim.SetBool("punetazo", true);
colisionplayerPuno.isTrigger = true;
}
else
{
Anim.SetBool("punetazo", false);
colisionplayerPuno.isTrigger = false;
}
}
}
Y este el de la vida.
using UnityEngine;
using System.Collections;
public class vidaPlayer : MonoBehaviour
{
public static int vida;
public int MaxHealt = 100;
public int MinHealt = 0;
void Start()
{
if (vida == 0)vida = MaxHealt;
ApplyCure(0);
}
public void ApplyCure(int Value)
{
vida += Value;
vida = Mathf.Clamp(vida, MinHealt, MaxHealt);
}
public void QuitarVidaPlayer(int Value, Vector3 hitPoint)
{
vida -= Value;
vida = Mathf.Clamp(vida, MinHealt, MaxHealt);
}
}
Que la vida algunas veces no se recarga bien y no es independiente de cundo ataco o otro enemigo en el slider.
Yo probaria a aumentar el collider de las piernas y brazos asi detectara la collision un poco antes de que este llege y dara una mejor apariencia Pero solo el collider no la apariencia (Mesh).Un saludo
Si esta a 0.5 el radio es una esfera de colision grande para el modelo deberia colisionar bien.
(//<fileStore.core_Attachment>/monthly_2015_11/collirer.jpg.5a09b040fc969ebe7f24afcd20efed10.jpg)
Pero está como de lado, por qué no la centras?
esta el centro y no es eso es
Physics.Raycast
Lo pongo asin el codigo y colisiona perfectamente sinenvargo no funciona el Destroy del objeto del Script vidaAI.using UnityEngine;
using System.Collections;
public class ColisionPlayer: MonoBehaviour
{
public float sinkSpeed = 0.5f;
public LayerMask LayerCol;
AudioSource GolpeSonido;
public ParticleSystem particulas;
Player player;
RaycastHit GolpeHit;
public GameObject objeto;
vidaAI vidaAi;
void Start()
{
vidaAi = objeto.GetComponent<vidaAI>();
GolpeSonido = GetComponentInParent<AudioSource>();
player = GetComponentInParent<Player>();
}
void OnTriggerEnter(Collider colision)
{
if (colision.gameObject.CompareTag("Enemigo"))
{
if (vidaAi != null)
vidaAi.QuitarVIdaAI(20, GolpeHit.point);
GolpeSonido.Play();
Player.damaged = true;
particulas.transform.position = GolpeHit.point;
particulas.Play();
StartCoroutine(SliderEnemigoTrue());
}
}
Ahora lo he puesto asin y funciona bien las colisiones hasta que llego al segundo enemigo y me lanza el tipico errorMissingReferenceException: The object of type 'vidaAI' has been destro*** but you are still trying to access it.
Your script should either check if it is null or you should not destroy the object.si ya lo he puesto en no nulo porque me sale el errorusing UnityEngine;
using System.Collections;
public class ColisionPlayer : MonoBehaviour
{
public float sinkSpeed = 0.5f;
public LayerMask LayerCol;
AudioSource GolpeSonido;
public ParticleSystem particulas;
Player player;
Ray GolpeRay;
RaycastHit GolpeHit;
void Start()
{
GolpeSonido = GetComponentInParent<AudioSource>();
player = GetComponentInParent<Player>();
}
void OnTriggerEnter(Collider colision)
{
if (colision.gameObject.CompareTag("Enemigo"))
{
vidaAI vidaAi = colision.gameObject.GetComponent<vidaAI>();
if (vidaAi != null)
vidaAi.QuitarVIdaAI(20, GolpeHit.point);
GolpeSonido.Play();
Player.damaged = true;
particulas.transform.position = GolpeHit.point;
particulas.Play();
StartCoroutine(SliderEnemigoTrue());
}
}
IEnumerator SliderEnemigoTrue()
{
yield return new WaitForSeconds(0.0f);
player.sliderAI.gameObject.SetActive(true);
yield return new WaitForSeconds(3f);
player.sliderAI.gameObject.SetActive(false);
yield return null;
}
}
[/quote]
y me salta a esta linea del script vidaAIDeath += () => { Destroy(gameObject); };
esa función anónima no está devolviendo nada, tiene que hacer return con un valor para sumarlo.
Te estas equivocando muchísimo, esta todo mal diseñado, y jamás funcionara, ni mucho menos de forma Optima.Rediseña todo el proyecto, en ves de pegar 3 script diferentes con mucha incoherencia, haz un diseño, lo subes al foro y yo te ayudare un poco, pero de esta manera, nadie puede brindar ayuda, esta todo muy desordenado, malas implementación, errores.UN Saludo!
Bueno yo no soy programador y estoy aprendiendo
Que bajonazo francoe1 tio solo lo hago para entretenerme y aprender, estoy enfermo tengo trastorno bilpolar y de la personalidad multiple, no tengo estudios y soy pensionista demasiado digo yo que hago.
Arreglado
La leche! Pues podías haber puesto otra foto en el profile.
soy yo makillado con photoshop
Jajajajaja