unity里unity anima2d教程制作的角色如何添加collider?

关于制作 Unity 2D 格斗游戏的思路讨论 | indienova 独立游戏
前言本文是一篇有关使用 Unity 引擎制作 2D 格斗游戏的方法讨论。本文作者试图使用 Unity 2D 进行格斗游戏制作,并且得到了一些基础的解决方案,但在思路上遇到了一些问题。由于目前关于格斗游戏的制作讨论并不很多,而格斗游戏的制作也有着涉及到物理判定的许多困难,因此尽管讨论非常基础,仍刊登本文试图引发讨论。目前已经解决的问题角色的多重判定框问题我在角色下面创建了多个子物体,并给这些物体添加 Trigger 作为角色的各种判定框,然后在动画中调节每一帧的判定框位置并利用帧事件来控制判定框的开启与否。角色目前的状态我写了一个 enum 结构体用来记录角色当前的状态,并在大多情况下利用动画帧事件来切换状态。比如在“垂直跳跃”动画的第一帧调用 AnimEventJump 函数事件。并且不同状态下能做什么事,在 Update 中利用 switch 来实现。目前写了一个实现“打击感”中顿帧的方法:当 Attack 标签(tag)的判定框碰到2PHurt 标签的判定框时,首先关闭该 Attack 判定框,然后将角色的动画播放速度设置为0。并控制 HitStop 秒后恢复播放速度为1(HitStop 位 float 值,用来控制顿帧时间),这样就实现了顿帧效果。目前测试还算可行,但不知道这样的思路是否正确。思路探讨即使有了以上的解决方案,我仍然面临了诸多问题,对于整体思路进行反思,不知其是否正确,因此拿出与大家进行讨论。学习 Unity 并且打算使用其进行格斗游戏制作之后,我很自然地、创建了角色(sprite)和其动画。然后为角色添加了 RigidBody2D 刚体组件和碰撞框 BoxCollider2D。角色有重量,有 Collider,自然会落到下面那个有 Collider 的 Ground(作为地面的物体)上。所以,目前角色的站立完全是靠 Unity 自带的 Collider 和 RigidBody 属性来实现的。为了实现角色的移动,试过用 AddForce 和控制速度(velocity)来实现,但最后觉得最适合格斗游戏的移动方式还是直接控制角色坐标(transform.position +=)。我利用动画帧事件实现了跳跃,在“垂直跳跃”的第二帧添加事件“AddForce(Vector2.up*JumpPower)”来实现起跳。而“垂直跳跃”的第一帧仍是站立图片,为了实现“向前跳跃”和“向后跳跃”而留出这一帧的时间让玩家同时按下“上(8)”和“前/后(6/4)”再判断执行“向前跳跃”,“向后跳跃”,“垂直跳跃”中的哪一个。现在遇到的最主要的问题是:角色不仅能站在地面上,还能站在另一个角色头上。因为我完全是依赖 Coliider 和 RigidBody 而实现的站立,所以当角色跳到另一个拥有 BoxCollider 的角色头上时,自然也会站在上面。我尝试用 OnCollisionEnter 来解决这个问题,当角色有所接触时,如果是站在了另一个角色头上,就让另一个角色移开一段距离或自己移开。但不知为何效果没有实现。我也并没有从代码中找出问题所在。后来我去学习了 GameMaker 这个引擎,一是想从这个引擎中找到思路。二是看到过很多用 Undertale,Rival of Aether 等用 GameMaker 做出来的游戏质量都很不错,早就感兴趣。而在学习中,发现 GameMaker 通常采用 Place_meeting 来实现物体碰撞,比如当物体的正下方接触到名为 Ground 的物体时,物体 y 轴坐标不会改变。于是我想到在 Unity 中用射线 Physic.Raycast 来检测角色某一方向的碰撞,但也仅仅是想到这就卡住了,仍然不知道该如何解决。希望与诸位探讨,传统的2D 格斗游戏的设计思路究竟是怎样的。以及怎样用 Unity 来实现这种思路。
近期点赞的会员
&分享这篇文章
我们可是热血沸腾的思春期少年!根本把持不住自己哦!&
您可能还会对这些文章感兴趣
参与此文章的讨论
兄弟你把牛关的问题来这边再问一次我能理解...
@indienova 站长把这篇文推首页我就有点不能理解了...
这可是一篇求助文耶(。-`&-)
您需要登录或者注册后才能发表评论
<div id="failed-message" data-notify-position="top-right" data-notify-type="error" data-notify-msg=" 操作失败!请通知管理人员。">unity3d游戏制作制作如何设置场景角色移动设备_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
unity3d游戏制作制作如何设置场景角色移动设备
阅读已结束,下载本文需要
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
&#xe64e;加入VIP
还剩42页未读,
定制HR最喜欢的简历
你可能喜欢&>&unity anima2d
unity anima2d
上传大小:8.17MB
unity3d 2动画制作插件,anima2d。。可制作unity 3d 2D游戏所适用的2D动画
综合评分:0
下载个数:
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var parentWrap = $(this).parents(".respond_box"),
q = parentWrap.find(".form1").serializeArray(),
resStr = $.trim(parentWrap.find(".res_area_r").val());
console.log(q);
//var res_area_r = $.trim($(".res_area_r").val());
if (resStr == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
//var mess = $(".res_area_r").val();
var mess = resS
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, data.com_username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click", '.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
var parentWrap = $(v).parents(".respond_box");
parentWrap.find(".res_area_r").val($.trim(parentWrap.find(".res_area").val()));
评论共有0条
miao199388
综合评分:
积分/C币:12
VIP会员动态
CSDN下载频道资源及相关规则调整公告V11.10
下载频道用户反馈专区
下载频道积分规则调整V1710.18
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
资源所需积分/C币
当前拥有积分
当前拥有C币
输入下载码
为了良好体验,不建议使用迅雷下载
unity anima2d
会员到期时间:
剩余下载个数:
剩余积分:0
为了良好体验,不建议使用迅雷下载
积分不足!
资源所需积分/C币
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
为了良好体验,不建议使用迅雷下载
无法举报自己的资源
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可返还被扣除的积分
被举报人:
举报的资源分:
请选择类型
资源无法下载 ( 404页面、下载失败、资源本身问题)
资源无法使用 (文件损坏、内容缺失、题文不符)
侵犯版权资源 (侵犯公司或个人版权)
虚假资源 (恶意欺诈、刷分资源)
含色情、危害国家安全内容
含广告、木马病毒资源
*详细原因:
unity anima2d学习Unity2D屏幕点击选中方法 VR开发教程
可能在手机端做2D屏幕点击,选中精灵的操作还是比较少的,所以这方面的可以查到的资料也比较匮乏,很多都是3D中的选中算法,实际原理也比较简单,就是射线命中法,从相机到屏幕点击点发出射线,命中的精灵就是点击选中的精灵了,当然精灵要有物理碰撞的区域,不然无法检测。实际原理都是一样的。
1.Raycast法
原理相同于3D中得Raycast法,具体使用略有区别。
RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero);
if(hit.collider != null)
  Debug.Log (\&Target Position: \& + hit.collider.gameObject.transform.position);
2.Overlap法
个人觉得这个方法对于2D更合适一些,判断点击的点落在了哪些collider中。
Collider2D[] col = Physics2D.OverlapPointAll(Camera.main.ScreenToWorldPoint(Input.mousePosition));
if(col.Length & 0)
&&&&foreach(Collider2D c in col)
以上代码中用到的是mousePosition,对于触摸的Touch原理完全相同。
现在方法有了剩下的就是如何实践实现的问题了,在我看来具体实现涉及到两个问题,一个是鼠标点击选中,另一是选中后如何呈现。真正实现了这两点才算是一个及格的学习实践。最终实现效果如下图所示:
这里有了背景分析后,我们的需求是这样:
&通过鼠标点击场景中的精灵,置精灵为选中状态(这里采用的方式是透明化)&。
有了需求,我们开始技术分析,大体需要一下几个知识点,我们逐一破结,学习
1、鼠标点击
2、2D精灵命中测试,需要2D物理碰撞
3、给精灵添加物理碰撞
4、命中的深度测试(根据原理被射线穿透的可能有多个精灵而我们应该选中的应该是离相机最近的,也就是深度最小的且唯一)
5、选中精灵的透明化处理
列出这五点出来,我也有点惊讶了,竟然这么多技术功能点,汗!
1、鼠标点击
有两种方式实现,
传统方式在Update中添加鼠标点击处理,如下所示:
&&& void Update () {
&&&&&&& if (Input.GetMouseButtonDown(0))
&&&&&&& {}
这种方法的缺点,就是放在Update中的逻辑较多,当代码复杂的时候,可读性比较差
用Unirx实现,有点像传统的winform事件订阅方式
void Start()
//鼠标点击控制
Observable.EveryUpdate().Where(_ =& Input.GetMouseButtonDown(0)).Subscribe(LeftMouseClick2);
2、2D精灵命中测试
这个基本就是用资料中的Overlap法 ,这里代码就不贴出来了,在4中会贴出完整代码。
3、给精灵添加物理碰撞
这里可以用传统的方式在Unity IDE中可视化的为GameObject添加 ColliderBox组件,然后设置Size也就是鼠标点击区域
由于教程中的精灵是动态创建的,所以我的Box Collider 2D插件也是用代码动态添加的,这里当然也可以不局限Box Collider 2D如果需要更好的物理选中效果,也可以采用更精确的,我的代码如下所示:
//动态添加碰撞
BoxCollider2D boxCollider2D = qxPlayer.AddComponent&BoxCollider2D&();
boxCollider2D.size = new Vector2(mixSpriteSetting.Collider2DSizeWidth, mixSpriteSetting.Collider2DSizeHeight);
其中qxPlayer就是我的精灵GameObject了。
4、命中的深度测试
实际上要解决的问题就是&根据原理被射线穿透的可能有多个精灵而我们应该选中的应该是离相机最近的,也就是深度最小的且唯一&
如何获取最近的精灵的我查阅了下Unity API文档 关键部分我用红色字标出来了:
Get a list of all colliders that overlap a point in space.
This function is similar to OverlapPoint except that all colliders that overlap the point are returned.&The colliders in the returned array are sorted in order of increasing Z coordinate.&An empty array is returned if there are no colliders over the point.
Note that this function will allocate memory for the returned Collider2D array. You can use OverlapPointNonAlloc to avoid this overhead if you need to make the check frequently.
有了Unity卓越的工作,再加上本身我的精灵对象使用的画家算法,自然数组中第一就是离相机(屏幕)最近的了,接下来只要根据Name获得第一个精灵即可,如下代码所示
/// &summary&
/// 鼠标左键点击
/// &/summary&
/// &param name=\&l\&&&/param&
private void LeftMouseClick2(long l)
&&&&Collider2D[] col = Physics2D.OverlapPointAll(Camera.main.ScreenToWorldPoint(Input.mousePosition));
&&&&if (col.Length & 0)
&&&&&&&&foreach (Collider2D c in col)
&&&&&&&&&&&&string keyName = c.GetComponent&Collider2D&().gameObject.
&&&&&&&&&&&&QXPlayerController sprite = Find(keyName);
&&&&&&&&&&&&if (sprite != null)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&sprite.SetTransparent(true);
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&Debug.Log(\&Target Position: do what you want\& + keyName);
&&&&&&&&&&&&&&&&break;&&&&&&&&&&&&&&&
&&&&&&&&&&&&}
其中Find函数通过gameObject.Name遍历查找我在场景中所有的精灵对象的封装函数,比较简单就不解释了
/// &summary&
/// 在场景地图中查找Name精灵控件
/// &/summary&
private QXPlayerController Find(string name)
&&&&return sprites.ContainsKey(name) ? sprites[name] : null;
5、选中精灵的透明化处理
设置选中精灵的半透明就变的轻松加愉快了,代码如下比较简单
/// &summary&
/// 设置透明度
/// &/summary&
/// &param name=\&isTransparent\&&true为透明,false为不透明&/param&
public void SetTransparent(bool isTransparent)
&&&&spriteRenderer.color = new Color(1f, 1f, 1f, isTransparent?0.5f:1f);
至此一套完整的Unity 2D 精灵鼠标点击选中的解决方案完成了,希望对您有帮助。
<font color=#-20<font color=#-20<font color=#-19<font color=#-15<font color=#-14<font color=#-14<font color=#-14<font color=#-14<font color=#-14<font color=#-13
早在去年7月份,为了让 VR/AR 应用开发人员更轻松地创建和更直观地看到 3D 虚拟对象,...
想知道在Unity中如何将游戏中角色对话的唇型与面部微表情达到次时代的水准吗?想知道...
近日,RLTY CHK工作室的联合创始人Nick Robinson发布了一篇文章,以媒体天师麦克卢汉...
VR设计师和开发者们开始着手如何让VR环境及体验更加有趣、逼真。以下是一些关于如何为room...
笔者在为《幻想装置》和《工作模拟》制作出混合现实的预告片以后,研究了更深层次的VR...}

我要回帖

更多关于 unity edgecollider2d 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信