dXNpbmcgVW5pdHlFbmdpbmU7CnVzaW5nIFVuaXR5RW5naW5lLlVJOwp1c2luZyBVbml0eUVuZ2luZS5TY2VuZU1hbmFnZW1lbnQ7CgpwdWJsaWMgY2xhc3MgUGVuZ3VpbkNvbnRyb2xsZXIgOiBNb25vQmVoYXZpb3VyCnsKICAgIHB1YmxpYyBmbG9hdCBmbGFwRm9yY2UgPSA1ZjsKICAgIHB1YmxpYyBUZXh0IGRpc3RhbmNlVGV4dDsKICAgIHB1YmxpYyBHYW1lT2JqZWN0IGdhbWVPdmVyUGFuZWw7CgogICAgcHJpdmF0ZSBSaWdpZGJvZHkyRCByYjsKICAgIHByaXZhdGUgVmVjdG9yMyBzdGFydFBvczsKICAgIHByaXZhdGUgYm9vbCBpc0FsaXZlID0gdHJ1ZTsKCiAgICB2b2lkIFN0YXJ0KCkKICAgIHsKICAgICAgICByYiA9IEdldENvbXBvbmVudCZsdDtSaWdpZGJvZHkyRCZndDsoKTsKICAgICAgICBzdGFydFBvcyA9IHRyYW5zZm9ybS5wb3NpdGlvbjsKICAgICAgICBnYW1lT3ZlclBhbmVsLlNldEFjdGl2ZShmYWxzZSk7CiAgICB9CgogICAgdm9pZCBVcGRhdGUoKQogICAgewogICAgICAgIGlmICghaXNBbGl2ZSkgcmV0dXJuOwoKICAgICAgICAvLyDnvr3jgbDjgZ/jgY3vvIjplbfmirzjgZfvvIkKICAgICAgICBpZiAoSW5wdXQuR2V0QnV0dG9uKCZxdW90O0ZpcmUxJnF1b3Q7KSkKICAgICAgICB7CiAgICAgICAgICAgIHJiLnZlbG9jaXR5ID0gbmV3IFZlY3RvcjIocmIudmVsb2NpdHkueCwgZmxhcEZvcmNlKTsKICAgICAgICB9CgogICAgICAgIC8vIOW4uOOBq+WPs+aWueWQkeOBq+WwkeOBl+mAsuOCgAogICAgICAgIHJiLnZlbG9jaXR5ID0gbmV3IFZlY3RvcjIoMmYsIHJiLnZlbG9jaXR5LnkpOwoKICAgICAgICAvLyDot53pm6LoqIjmuKwKICAgICAgICBmbG9hdCBkaXN0YW5jZSA9IHRyYW5zZm9ybS5wb3NpdGlvbi54IC0gc3RhcnRQb3MueDsKICAgICAgICBkaXN0YW5jZVRleHQudGV4dCA9ICZxdW90O0Rpc3RhbmNlOiAmcXVvdDsgKyBkaXN0YW5jZS5Ub1N0cmluZygmcXVvdDtGMSZxdW90OykgKyAmcXVvdDttJnF1b3Q7OwoKICAgICAgICAvLyDlnLDpnaLooZ3nqoHjgafjgrLjg7zjg6Djgqrjg7zjg5Djg7wKICAgICAgICBpZiAodHJhbnNmb3JtLnBvc2l0aW9uLnkgJmx0OyAtNGYpCiAgICAgICAgewogICAgICAgICAgICBHYW1lT3ZlcigpOwogICAgICAgIH0KICAgIH0KCiAgICB2b2lkIEdhbWVPdmVyKCkKICAgIHsKICAgICAgICBpc0FsaXZlID0gZmFsc2U7CiAgICAgICAgcmIudmVsb2NpdHkgPSBWZWN0b3IyLnplcm87CiAgICAgICAgZ2FtZU92ZXJQYW5lbC5TZXRBY3RpdmUodHJ1ZSk7CiAgICB9CgogICAgcHVibGljIHZvaWQgUmV0cnkoKQogICAgewogICAgICAgIFNjZW5lTWFuYWdlci5Mb2FkU2NlbmUoU2NlbmVNYW5hZ2VyLkdldEFjdGl2ZVNjZW5lKCkubmFtZSk7CiAgICB9Cn0KdXNpbmcgVW5pdHlFbmdpbmU7CgpwdWJsaWMgY2xhc3MgQ2FtZXJhRm9sbG93IDogTW9ub0JlaGF2aW91cgp7CiAgICBwdWJsaWMgVHJhbnNmb3JtIHRhcmdldDsKICAgIHB1YmxpYyBmbG9hdCBzbW9vdGhTcGVlZCA9IDAuMTI1ZjsKICAgIHB1YmxpYyBWZWN0b3IzIG9mZnNldDsKCiAgICB2b2lkIExhdGVVcGRhdGUoKQogICAgewogICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCkgcmV0dXJuOwoKICAgICAgICBWZWN0b3IzIGRlc2lyZWRQb3NpdGlvbiA9IG5ldyBWZWN0b3IzKAogICAgICAgICAgICB0YXJnZXQucG9zaXRpb24ueCArIG9mZnNldC54LAogICAgICAgICAgICBvZmZzZXQueSwKICAgICAgICAgICAgb2Zmc2V0LnoKICAgICAgICApOwoKICAgICAgICBWZWN0b3IzIHNtb290aGVkUG9zaXRpb24gPSBWZWN0b3IzLkxlcnAodHJhbnNmb3JtLnBvc2l0aW9uLCBkZXNpcmVkUG9zaXRpb24sIHNtb290aFNwZWVkKTsKICAgICAgICB0cmFuc2Zvcm0ucG9zaXRpb24gPSBzbW9vdGhlZFBvc2l0aW9uOwogICAgfQp9
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class PenguinController : MonoBehaviour
{
public float flapForce = 5f;
public Text distanceText;
public GameObject gameOverPanel;
private Rigidbody2D rb;
private Vector3 startPos;
private bool isAlive = true;
void Start()
{
rb = GetComponent<Rigidbody2D>();
startPos = transform.position;
gameOverPanel.SetActive(false);
}
void Update()
{
if (!isAlive) return;
// 羽ばたき(長押し)
if (Input.GetButton("Fire1"))
{
rb.velocity = new Vector2(rb.velocity.x, flapForce);
}
// 常に右方向に少し進む
rb.velocity = new Vector2(2f, rb.velocity.y);
// 距離計測
float distance = transform.position.x - startPos.x;
distanceText.text = "Distance: " + distance.ToString("F1") + "m";
// 地面衝突でゲームオーバー
if (transform.position.y < -4f)
{
GameOver();
}
}
void GameOver()
{
isAlive = false;
rb.velocity = Vector2.zero;
gameOverPanel.SetActive(true);
}
public void Retry()
{
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
}
}
using UnityEngine;
public class CameraFollow : MonoBehaviour
{
public Transform target;
public float smoothSpeed = 0.125f;
public Vector3 offset;
void LateUpdate()
{
if (target == null) return;
Vector3 desiredPosition = new Vector3(
target.position.x + offset.x,
offset.y,
offset.z
);
Vector3 smoothedPosition = Vector3.Lerp(transform.position, desiredPosition, smoothSpeed);
transform.position = smoothedPosition;
}
}