跟siki学院教程学习愤怒的小鸟案例猪多次碰撞解决记录<一>

愤怒的小鸟学习过程遇到的细节

愤怒的小鸟运动过快如何消除残影

主要是因为Interpolate插值算法
Rigidbody.interpolation

插值可以平滑消除固定帧率运行物理导致的现象。

默认情况下,插值是关闭的。通常对玩家的角色使用刚体插值。 物理以离散时间步长运行,而图形以可变帧率渲染。 由于物理和图形并不完全同步,这可能导致对象出现视觉抖动。 这种效果很细微,但通常能够在玩家角色上看到,特别是当摄像机跟随主角时。 建议对主角打开插值,对于其他所有内容,则禁用它。

愤怒的小鸟运动过快如何消除残影

猪的多次碰撞受伤bug

下面为猪受伤的部分源代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Pig : MonoBehaviour {
    public float maxSpeed = 10;
    public float minSpeed = 2;
    private SpriteRenderer render;
    public Sprite hurt;
    public GameObject boom;
    private void Awake()
    {
        render = GetComponent<SpriteRenderer>();
    }
    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.relativeVelocity.magnitude > maxSpeed)
        {
            Dead();
        }
        else if(collision.relativeVelocity.magnitude > minSpeed && collision.relativeVelocity.magnitude<maxSpeed) {
            render.sprite = hurt;
        }
    }
    void Dead() {
        Destroy(gameObject);
        Instantiate(boom, transform.position, Quaternion.identity);
    }
}
————————————————
版权声明:本文为CSDN博主「renwen1579」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/renwen1579/article/details/121055089

猪应该累计受伤程度判断是否致死

我在这个基础上通过设定几个速度丰富了猪受伤的阶段状态
但是也存在很多冲突

导致音频播放重复

轻重伤图片来回切换bug

以下是我在前辈的基础上编的,轻喷
(把区分木头和猪的isPig给省略了)

public class pig : MonoBehaviour
{
    public float ASpeed = 16;
    public float BSpeed = 10;
    public float CSpeed = 4;
    private SpriteRenderer render;
    public Sprite Ahurt;
    public Sprite Bhurt;
    public GameObject boom;
    public GameObject score;
    public AudioClip hurtClip;
    public AudioClip dead;
    public AudioClip birdCollision;
    [Space]
    private float PigHurt = 0;
    private bool hasCollided = false;
    private void Awake()
    {
        render = GetComponent<SpriteRenderer>();
    }
    private void OnCollisionEnter2D(Collision2D collision)
    {
        print(collision.relativeVelocity.magnitude);
        if (collision.relativeVelocity.magnitude > ASpeed||PigHurt>=10)
        {
            AudioPlay(birdCollision);
            AudioPlay(dead);
            PigHurt += 10;
        }
        if (collision.relativeVelocity.magnitude > BSpeed && collision.relativeVelocity.magnitude <= ASpeed)
        {
            AudioPlay(birdCollision);
            AudioPlay(hurtClip);
            PigHurt += 5;
        }
        if (collision.relativeVelocity.magnitude > CSpeed && collision.relativeVelocity.magnitude <= BSpeed)
        {
            AudioPlay(birdCollision);
            AudioPlay(hurtClip);
            PigHurt += 3;
        }
        //以下解决多次碰撞的问题
        this.hasCollided = true;
        if (this.hasCollided == true) {    Dead(); }
    }
    void LateUpdate()
    {
        this.hasCollided = false;
    }
        //利用LateUpdate()以及hasCollided控制变量打时间差
        //https://www.cnblogs.com/sanyejun/p/11439002.html
        //理论上我理解的确可以解决多次碰撞的问题,但是在设置时间的时候还是搞不太定
        //但感觉碰撞少了很多了
        //这里rigidbody的Collision Detection还是设置Continuous连续型的好些吧,我也测试区别不太出来...有大佬知道吗

    void Dead()
    {
        if (PigHurt >= 10)
        {
            GameManager.instance.pigs.Remove(this);
            Instantiate(boom, transform.position, Quaternion.identity);
            GameObject coreObject = Instantiate(score, transform.position + new Vector3(0, 1f, 0), Quaternion.identity);
            Destroy(coreObject, 1.5f);
            Destroy(gameObject);
        }        
        if (PigHurt > 0 && PigHurt <= 5)
        {
            render.sprite = Bhurt;
            //把受伤的图片放到最后累计分数的环节再显示出来,解决轻重伤图片来回切换bug
        }
        if (PigHurt > 5 && PigHurt < 10)
        {
            render.sprite =Ahurt;
        }
    }
    public void AudioPlay(AudioClip clip)
    {
        AudioSource.PlayClipAtPoint(clip, transform.position);
    }
}

两个UI界面按钮冲突使得重玩飞不了鸟

还有一个bug,过几天研究,先做完主界面的关卡撒,记录在这

两个UI界面按钮冲突使得重玩飞不了鸟unity愤怒的小鸟

发现错误原因:
分别在暂停UI界面和(胜利失败UI界面)挂了不同的代码文件使用重玩函数和回到主界面函数,胜利失败UI 界面的重玩函数就忘记加Time.timeScale = 1;就冲突卡了。

别忘了当胜利失败UI界面出现时,写代码让暂停UI界面失活

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值