unity切水果

2015年02月02日 14:00 0 点赞 0 评论 更新于 2025-11-21 15:59

在本教程中,我们将使用Unity创建一个简单的切水果游戏。下面将详细介绍实现该游戏的过程。

主要功能概述

游戏场景中放置一个苹果,玩家通过手滑过苹果,可将其切成两半。原理是制作两张分别表示分开的两半苹果的贴图,让它们在苹果当前位置出现,为这两半苹果添加刚体属性,并分别施加相反的力,使其自由落体。

效果图

(此处可插入效果图,原文未提供,需补充)

实现步骤

1. 原理分析

通过摄像机发出一条射线,使射线碰撞到具备碰撞器的苹果。这就需要给苹果添加 BoxCollider 属性。当苹果检测到碰撞时,在当前位置生成两个具有刚体(物理)属性的半边苹果,它们的方向随机出现,并随机添加向量力,使这两个半个苹果做自由下落运动。

2. 半边苹果的制作

  1. 创建材质球并赋予贴图:创建一个材质球,然后为其赋予贴图属性,贴图可参考下图红色区域的图片(此处需补充图片)。
  2. 添加属性并设置选项:给半边苹果添加 BoxColliderRigidbody 两个属性,并勾选以下选项:
    • IsTrigger:勾选该选项时,触发器不会碰撞刚体,但当刚体退出或进入触发器时,将会发送 OnTriggerEnterOnTriggerExitOnTriggerStay 消息。
    • UseGravity:字面意思是使用重力。
    • Constraints:用于约定冻结旋转和移动。这里冻结了Z轴的移动,即不允许苹果前后位置的移动;冻结了X、Y轴方向的旋转,即不能让苹果前后翻转或者左右旋转。
  3. 制作预制体并删除场景对象:将这半个苹果制作成预制体(Prefab),然后删除场景中的半个苹果的 GameObject

3. 完整苹果的属性设置

主要是让主苹果具备 BoxCollider 属性,以便射线能够碰撞到它。同时,必须添加 AudioSource 组件,否则会报错。

4. 源代码

以下两个代码需要附加在 Apple00(即主苹果)上。

knifeRay01.cs

该脚本的功能是,如果射线碰撞到苹果,就显示出两半苹果,并给它们添加两个方向相反的方向力。

using UnityEngine;
using System.Collections;

public class knifeRay01 : MonoBehaviour
{
// 刀光的预制体
public GameObject myRay;
public AudioClip knifeSound;
public bool isHit = false;
public Vector3 rayPosition;
public bool isRay = false;
public GameObject firstFruit;
public GameObject secondFruit;
private GameObject myFirstFruit;
private GameObject mySecondFruit;
private Vector3 firstPosition;
private Vector3 secondPosition;
private bool isClicked = false;
private LineRenderer lineRenderer;
private GameObject rayGameObject;
private float angle;

void Update()
{
bool isMouseDown = Input.GetMouseButton(0); // 判断鼠标是否左击

if (isHit)
{
if (isMouseDown && !isClicked)
{
// 屏幕坐标转化成空间坐标
firstPosition = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 1));
isClicked = true;
}
else if (isMouseDown)
{
secondPosition = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 1));
}
// 鼠标提起
else if (Input.GetMouseButtonUp(0))
{
isRay = true;
secondPosition = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 1));

if (secondPosition.x != firstPosition.x)
{
angle = Mathf.Atan((secondPosition.y - firstPosition.y) / (secondPosition.x - firstPosition.x));
print("角度:" + angle * 180 / Mathf.PI);
}
else
{
angle = 0;
}

// 创建划痕,这里旋转的是幅度
rayGameObject = Instantiate(myRay, rayPosition, Quaternion.AngleAxis(angle * 180 / Mathf.PI, Vector3.forward)) as GameObject;

// 两个被切的水果
myFirstFruit = Instantiate(firstFruit, transform.position, Quaternion.AngleAxis(Random.Range(50, 180) * 180 / Mathf.PI, Vector3.forward)) as GameObject;
mySecondFruit = Instantiate(secondFruit, transform.position, Quaternion.AngleAxis(Random.Range(80, 150) * 180 / Mathf.PI, Vector3.forward)) as GameObject;

// 这里方向是随机出现的,其实正确的应该是计算切线的角度来计算苹果切开两半的一个飞溅的方向
if (Random.Range(1, 10) > 5)
{
// 给加一个力,方向相反
myFirstFruit.GetComponent<Rigidbody>().velocity = new Vector2(5, 10);
mySecondFruit.GetComponent<Rigidbody>().velocity = new Vector2(-8, -10);
}
else
{
myFirstFruit.GetComponent<Rigidbody>().velocity = new Vector2(-5, 10);
mySecondFruit.GetComponent<Rigidbody>().velocity = new Vector2(8, -10);
}

Physics.gravity = new Vector3(0, -20, 0);
Destroy(myFirstFruit, 2.0f);
Destroy(mySecondFruit, 2.0f);

if (GetComponent<AudioSource>().isPlaying)
{
GetComponent<AudioSource>().Stop();
}
else
{
PlaySound(knifeSound);
print("播放声音");
}

Destroy(rayGameObject, 0.2f); // 立马释放刀光
isClicked = false;
isHit = false;
Destroy(rayGameObject, 1.0f); // 一秒钟就去掉
}
}
else
{
isRay = false;
}
}

void PlaySound(AudioClip soundName)
{
if (!GetComponent<AudioSource>().isPlaying)
{
AudioSource.PlayClipAtPoint(soundName, new Vector3(0, 0, -10)); // 在指定位置播放
}
}
}

hitByKnife.cs

该脚本用于判断射线是否碰撞到苹果。

using UnityEngine;
using System.Collections;

public class hitByKnife : MonoBehaviour
{
private bool isClicked = false;

void Update()
{
bool isMouseDown = Input.GetMouseButton(0); // 判断鼠标是否左击

if (!isClicked)
{
if (isMouseDown)
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (GetComponent<Collider>().Raycast(ray, out hit, 1000f))
{
transform.GetComponent<knifeRay01>().isHit = true;
transform.GetComponent<knifeRay01>().rayPosition = hit.transform.position;
}
}
}
}
}

通过以上步骤,你就可以在Unity中实现一个简单的切水果游戏。在实际开发中,你可以根据需求对游戏进行进一步的优化和扩展。

作者信息

feifeila

feifeila

共发布了 3994 篇文章