unity-2d角色控制器
有关2d的移动控制
1.直接修改transform
–transform.translate –按输入vector3的方向和大小移动,可以选择输入参照的坐标系。
–vector3
–vector3.lerp -在两点间计算线性插值,可以用结果修改position,直线移动
–vector3.slerp -在两点间计算球形插值,用结果修改position,弧线移动
–vector3.movetowards -输入两点,及限制最大距离,返回一个不超过最大距离的点,直接移动。
–vector3.SmoothDamp -平滑的从A点逐渐移动到B点,可以设置移动总时间,最大速度,常见的用法是相机跟随目标。
2.修改rigidbody
–velocity -速度
–AddForce -施加力
–MovePosition -移动位置
–使用时应该在fixedUpdate,因为是按照物理引擎更新进度更新的,UpdatehefixedUpdate不是一个节奏,而且需要注意描述里写的条件和影响结果。
3.CharacterController并不适用于2D
地面检测
建立空对象,放在游戏对象下,提供游戏对象与地面接触的坐标,可用来检测游戏对象的脚下是不是地面。
linecast,可以通过划线的方式检测地面,详情可以见官方文档。
还有一种方法,overlap覆盖检测
如果用垂直速度来控制跳跃动画的播放,可以优化跳跃动画。
把动画过渡间的过度值去掉,可以减少动画播放的延迟。
一些UI(待移除条目)
可以在hierarchy菜单下创建,这个操作将会为我们自动做一些事。
创建Canvas对象,ui成为它的子对象,我们制作的任何ui对象都需要canvas的子对象才能被渲染。
他还创建了一个EventSystem,如果我们需要与按钮或滑块等ui交互,我们需要它。
在锚点预设按住alt键可以编辑ui的位置。
shadow组件可以在对象上添加阴影。
2d平台游戏角色的移动脚本
我们将会通过给刚体施加力的方式实现角色在地面上的移动,并且在角色转向的同时巧妙利用缩放信息”Scale”实现角色的sprite水平翻转。利用LayerMask类型来获取游戏对象的图层信息,用Physics2D.OverlapCircle来进行地面检测,来判断角色是否可以跳跃。且添加2段跳的功能。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class animation : MonoBehaviour
{
public float maxSpeed = 6f; //设置最大速度
bool isfacingright = true;//角色朝向默认设为true
Animator anim;
Rigidbody2D rbody2D;
bool grounded = true; //定义一个判断器来检测角色是不是在地面上。
public Transform GroundChecker;//地板判断器的坐标
float checkredius = 0.2f;//检测半径
public LayerMask whatisground; //决定在哪些层上检测地面
public float jumpforce = 700f; //跳跃的力
//bool doublejump = false;//多段跳的条件
void Start() {
anim = GetComponent<Animator>();//获取animator组件。
rbody2D = GetComponent<Rigidbody2D>();//获取刚体组件
}
public void FixedUpdate() {
anim.SetFloat("Vspeed", rbody2D.velocity.y);//将Vspeed设置为垂直方向上的速度,这个可以用来做跳跃的动画。
grounded = Physics2D.OverlapCircle(GroundChecker.position,checkredius,whatisground);//检测地面碰撞。
//GroundChecke为圆心,checkredius为半径进行地面检测。
anim.SetBool("grounded",grounded);//设置一个变量,动画控制器里的变量,把它的值和grounded返回的值一样。如果不需要anim这段代码可以忽视
//doublejump = false;
float direction = Input.GetAxis("Horizontal");//接收水平方向上的输入,<-取负值,->取正值。
anim.SetFloat("Speed", Mathf.Abs(direction * maxSpeed));//设置Speed参数的值,并且对它取绝对值,
rbody2D.velocity = new Vector2(direction * maxSpeed, rbody2D.velocity.y);//改变刚体物件的速度
if (direction > 0 && isfacingright == false)//检测翻转
{
Flip();
}
else if (direction < 0 && isfacingright == true)
{
Flip();
}
}
void Update() {
//实现跳跃和多段跳
if ( (grounded || !doublejump) && Input.GetKeyDown(KeyCode.Space)) {
grounded = false;
rbody2D.AddForce(new Vector2(0, jumpforce));//在y轴上添加一个力
/*if (!grounded && !doublejump)
{
doublejump = true;
}*/
}
}
void Flip() {//实现翻转
isfacingright = !isfacingright;//对当前朝向取反
Vector3 scale = transform.localScale;//角色相对坐标
scale.x *= -1;//对坐标取反
transform.localScale = scale;
}
}
2D弹幕射击游戏的简单控制
获取horizontal(水平)和Vertical(垂直)方向来控制角色运动
private void Moving()
{
int horizontal = 0;
int vertical = 0;
horizontal = (int)(Input.GetAxisRaw("Horizontal"));
vertical = (int)(Input.GetAxisRaw("Vertical"));
rb2d.velocity = new Vector2(horizontal * moveSpeed, vertical * moveSpeed);
}