【菜菜丸的菜鸟教程】钻水管和吃金币

1. 钻水管
思路:预先录制跳水管动画,使用Animator,在满足条件时(人物接触水管且按空格键)播放动画和音效。
过程:默认状态>跳入水管>人物缩小>位移到另一个水管>人物放大>恢复默认状态
主要函数:
(1)协程函数
StartCoroutine(jumpintotube)和IEnumerator jumpintotube()配合使用。从跳入管子到恢复默认状态的所有动作均在IEnumerator中完成。
等待时间的格式:yield return new WaitForSeconds(float);
(2)线性插值函数
设置:计时器(初始值为0,动态值为 += Time.deltaTime)、变化前的位置/大小和变化后的位置/大小。
gameObject.transform.localScale = Vector3.Lerp(startScaleSize, toScale, counter / duration);
脚本:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerMovement : MonoBehaviour { public float turnSpeed = 20f; Animator m_Animator; Rigidbody m_Rigidbody; Vector3 m_Movement; Quaternion m_Rotation = Quaternion.identity; bool touchTube; public AudioSource jump; public AudioSource intoTube; public float duration; public GameObject tube2; void Start () { m_Animator = GetComponent<Animator> (); m_Rigidbody = GetComponent<Rigidbody> (); } void FixedUpdate () { float horizontal = Input.GetAxis ("Horizontal"); float vertical = Input.GetAxis ("Vertical"); m_Movement.Set(horizontal, 0f, vertical); m_Movement.Normalize (); bool hasHorizontalInput = !Mathf.Approximately (horizontal, 0f); bool hasVerticalInput = !Mathf.Approximately (vertical, 0f); bool isRunning = hasHorizontalInput || hasVerticalInput; m_Animator.SetBool ("IsRunning", isRunning); Vector3 desiredForward = Vector3.RotateTowards (transform.forward, m_Movement, turnSpeed * Time.deltaTime, 0f); m_Rotation = Quaternion.LookRotation (desiredForward); if (touchTube == true) { if (Input.GetKeyDown("space")) { m_Animator.SetBool ("IsJumping", true); jump.Play(); StartCoroutine(jumpintotube()); } } } IEnumerator jumpintotube() { yield return new WaitForSeconds(1f); intoTube.Play(); float counter = 0; Vector3 startScaleSize = gameObject.transform.localScale; Vector3 startPosition = gameObject.transform.position; Vector3 toScale = new Vector3 (0.1f, 0.1f, 0.1f); Vector3 toScale2 = new Vector3 (1f, 1f, 1f); Vector3 toPosition = new Vector3 (0.98f, 0, 0.38f); Vector3 toPosition2 = new Vector3 (tube2.transform.position.x, tube2.transform.position.y + 0.7f, tube2.transform.position.z); while (counter < duration) { counter += Time.deltaTime; gameObject.transform.localScale = Vector3.Lerp(startScaleSize, toScale, counter / duration); gameObject.transform.position = Vector3.Lerp(startPosition, toPosition, counter / duration); yield return null; } gameObject.transform.position = new Vector3 (tube2.transform.position.x, tube2.transform.position.y, tube2.transform.position.z); jump.Stop(); intoTube.Stop(); m_Animator.SetBool ("IsJumping", false); yield return new WaitForSeconds(1f); intoTube.Play(); float counter2 = 0; Vector3 startPosition2 = gameObject.transform.position; while (counter2 < duration) { counter2 += Time.deltaTime; gameObject.transform.localScale = Vector3.Lerp(startScaleSize, toScale2, counter2 / duration); gameObject.transform.position = Vector3.Lerp(startPosition2, toPosition2, counter2 / duration); yield return null; } } void OnCollisionEnter(Collision collision) { if (collision.collider.tag == "Tube") { touchTube = true; } } void OnAnimatorMove () { m_Rigidbody.MovePosition (m_Rigidbody.position + m_Movement * Time.deltaTime * 2f); m_Rigidbody.MoveRotation (m_Rotation); } }
2. 吃金币
思路:金币的消失与重现,本来想用SetActive来做,结果发现金币物体设成false以后,碰撞器也随之消失了,所以没法通过OnTriggerExit来变回true。经过研究,最后是用renderer.enabled = false来做,这样只会影响renderer组件,而不会影响碰撞器,就可以通过OnTriggerExit让renderer变回true了
脚本:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class CoinMovement : MonoBehaviour { public float speed; public AudioSource coin; public AudioClip coinSound; public Renderer coin_Renderer; void Update() { transform.Rotate(Vector3.up * Time.deltaTime * speed, Space.World); } void OnTriggerEnter(Collider other) { if (other.gameObject.CompareTag("Player")) { coin.Play(); StartCoroutine(WaitForSound()); } } IEnumerator WaitForSound() { float coinSoundDuration = coinSound.length; coin_Renderer.enabled = false; yield return new WaitForSeconds(coinSoundDuration); } void OnTriggerExit(Collider other) { if (other.gameObject.CompareTag("Player")) { Debug.Log("Exit"); coin_Renderer.enabled = true; } } }
示范视频 https://www.bilibili.com/video/BV1qZ4y1w79y/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值