怎么用Unity实现掘地求升游戏

这篇文章主要介绍了怎么用Unity实现掘地求升游戏的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用Unity实现掘地求升游戏文章都会有所收获,下面我们一起来看看吧。

实现方法

1.场景搭建

说干就干,我们来实际操作一下。

新建一个场景,用简易的3D物体来组装成猛男和锤子,挂上不同的材质用颜色区分一下。

怎么用Unity实现掘地求升游戏

然后分别挂上Rigibody,因为我们想的是让2D平面运行,因此在Rigibody上分别锁了Z轴的移动和X,Y轴的旋转,顺便把锤子上的重力去掉,因为待会要用代码去控制锤子的位置。


2.控制锤头

新建一个脚本挂载在父节点上,分别获取身体和锤子。

我们想要的效果是锤子能一直跟随鼠标移动且锤头一直指向鼠标,思路是在锤头添加一个空的子节点作为锤头的锚点,然后让整个锤子围绕着这个锚点的Z轴旋转让锤柄指向身体的方向。

public GameObject body;public GameObject hammer;Rigidbody body_rig;Rigidbody hammer_rig;Transform hammer_anchor;void Start(){
        body_rig = body.GetComponent<Rigidbody>();
        hammer_rig = hammer.GetComponent<Rigidbody>();
        hammer_anchor = hammer.transform.GetChild(2);}//物理相关的操作一般最好放在FixedUpdate里进行,与系统的物理计算保持同步
 private void FixedUpdate()
 {
        HammerControl();
 }void HammerControl(){
        //获取鼠标在屏幕上的坐标并转换为世界坐标
        Vector2 MousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);

        //通过修改锤子身上刚体的速度让锤子移动,向量的起点用锤头的坐标
        //注意这里要让锤头的锚点与锤子本身的坐标的Z值相等,为了让旋转轴与世界坐标的Z轴平行,同理鼠标坐标的Z值也直接使用锤子的坐标的Z值
        hammer_rig.velocity = (new Vector3(MousePosition.x, MousePosition.y, hammer.transform.position.z) - hammer_anchor.position) * 10;

        //获取身体到鼠标的方向
        Vector3 direction = (new Vector3(MousePosition.x, MousePosition.y, hammer_anchor.position.z) - new Vector3(body.transform.position.x, body.transform.position.y, hammer_anchor.position.z)).normalized;

        //让锤子沿着锤头锚点转向身体的方向
        hammer.transform.RotateAround(hammer_anchor.position, Vector3.Cross(hammer_anchor.up, direction), Vector3.Angle(hammer_anchor.up, direction));
 }

效果如图:

怎么用Unity实现掘地求升游戏

但是现在问题来了,因为只是简单模拟功能的效果,所以猛男并没有手,但是最终我们是希望锤子活动的范围离猛男有一个最大距离的限制,这样看起来好像是有一只无形的手来操作锤子一样,该如何计算这个范围呢?

怎么用Unity实现掘地求升游戏


由图可见这个问题的思路是,当锤头锚点在最大活动范围里面时是跟着鼠标的坐标走,当处于最大活动范围外的时候是跟着锤头锚点与身体坐标的向量和最大移动范围形成的圆的交点走。这个思路用于代码上就是当鼠标移动到最大距离范围之外时得到当前身体到鼠标位置的方向向量,然后让这个向量的长度等于最大距离的长度。

那么,我们在此基础上修改一下代码。

 public float MaxDistance;
 float RelativeDistance;//单独抽出一个函数获取最大距离以外的转换后的鼠标坐标
    Vector2 GetConfinedPosition(Vector2 mouseposition)
    {

        Vector2 Confined_MousePosition;

        //去掉body坐标的Z值,避免计算距离时的影响
        Vector2 body_position = new Vector2(body.transform.position.x, body.transform.position.y);

        //计算当前鼠标位置和身体位置的相对距离
        RelativeDistance = Vector2.Distance(mouseposition, body_position);

        if (RelativeDistance > MaxDistance)
        {
            //当相对距离大于自己设置的最大距离时,获取转换以后的目标坐标
            //这里的思路需要稍稍转一个弯,一开始是获取的是长度为最大距离,方向为身体到鼠标方向的向量。
            //在这个基础上加上身体的当前坐标,其等于是将这个向量的起始点设置为身体的坐标。
            //最后向量与坐标点可以直接相互转换,此时转换后的目标坐标就等于这个向量。
            Confined_MousePosition = (mouseposition - body_position).normalized * MaxDistance + body_position;
        }
        else
        {
            //若相对距离小于最大距离那么鼠标当前坐标就是目标坐标
            Confined_MousePosition = mouseposition;
        }     
        return Confined_MousePosition;
    }

然后把HammerControl()函数内的MousePosition的赋值修改一下:

//获取鼠标在屏幕上的坐标并转换为世界坐标,若相对距离大于最大距离则获得转换后的坐标
Vector2 MousePosition = GetConfinedPosition(Camera.main.ScreenToWorldPoint(Input.mousePosition));

最后调整MaxDistance到一个合适的值,效果如下:

怎么用Unity实现掘地求升游戏



3.控制身体的逆向运动

现在离实现就差最后一步了,前面思考实现方式的时候说过,锤头的移动方向与理论上身体移动的方向刚好是相反的,并且同为以身体重心为原点,锤子的最大移动距离为半径的圆的切线。那么我们顺着这个思路去做。

首先还有一个先决条件,锤子不能凭空受力,必须是杵在地上或者挂在障碍物上才行。

我们先在锤头上加一个碰撞盒子并在锤子上添加一个新建脚本,用几句简单的代码用来检测锤头是否碰撞到东西。

public class CollisionDetection : MonoBehaviour
{
    public bool IsCollision;

    private void OnCollisionEnter(Collision collision)
    {
        IsCollision = true;
    }
    private void OnCollisionExit(Collision collision)
    {
        IsCollision = false;
    }
}

这里要注意的是锤子是锤头的父物体,所以即便碰撞盒子不在锤子上,作为父物体的锤子依然能检测到子物体上的碰撞信息,反过来由于锤头上并没有刚体组件,所以脚本挂在锤头上是检测不到碰撞信息的。

然后当检测到碰撞时给予身体一个相反的速度值。

void HammerControl()
{

  //在给hammer_rig.velocity赋值后添加下面的代码
  if(hammer.GetComponent<CollisionDetection>().IsCollision)
        {
            BodyControl(hammer_rig.velocity);
        }
}

void BodyControl(Vector3 velociy)
 {
    body_rig.velocity = -velociy;   
 }

最后效果如下:

怎么用Unity实现掘地求升游戏

关于“怎么用Unity实现掘地求升游戏”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“怎么用Unity实现掘地求升游戏”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程之家行业资讯频道。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章主要介绍了Unity游戏开发中外观模式是什么意思,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家...
这篇文章主要介绍Unity中地面检测方案的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.普通射线在角色坐标(一般是脚底)...
这篇文章主要介绍了Unity游戏开发中如何消除不想要的黄色警告,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带...
这篇文章主要介绍了Unity中有多少种渲染队列,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解
这篇文章主要介绍Unity中如何实现Texture,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!了解Texture2D 如上图,Texture2D是一张
小编给大家分享一下Unity中DOTS要实现的特点有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让...
这篇文章给大家分享的是有关unity中如何实现UGUI遮罩流光特效的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。下面是核心shader:Sh...
这篇文章主要为大家展示了“Unity中如何实现3D坐标转换UGUI坐标”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下...
这篇文章主要介绍了Unity游戏开发中设计模式的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家...
这篇文章主要介绍了Unity中如何实现仿真丝袜渲染,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了...
这篇文章给大家分享的是有关Unity插件OVRLipSync有什么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。项目需要接入对话口型动...
这篇文章主要介绍了Unity性能优化之DrawCall的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家...
这篇文章给大家分享的是有关Unity给力插件之Final IK怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。这插件有什么用:一般游...
这篇文章给大家分享的是有关Unity中如何内嵌网页插件UniWebView的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、常见Unity中内...
小编给大家分享一下Unity如何做流体物理的几个轮子,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让...
小编给大家分享一下Unity中Lod和Occlusion Culling的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收...
这篇文章将为大家详细讲解有关Unity中LineRenderer与TrailRenderer有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获...
这篇文章主要介绍了Unity中coroutine问题的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起...
这篇文章将为大家详细讲解有关unity中spine怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。骨骼动画首先我们来看到...
这篇文章主要为大家展示了“Unity Shader后处理中如何实现简单均值模糊”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学...