该文来自学习chutianbo老师的笔记,链接b站
在我们制作好地图和回复道具之后,我们就需要为地图加上一个敌人。
敌人的简易移动1
public class EmenyController : MonoBehaviour
{
//设定移动速度变量
public float speed = 0.1f;
//声明一个2d刚体对象
Rigidbody2D rigidbody2D;
// 声明 Vector2 对象来存放敌人当前位置
Vector2 position;
//声明一个初始 y 坐标变量
float initY;
//声明一个移动方向的变量
float direction;
//存放移动距离的变量,设置为共有,开放在 unity 中的访问
public float distance = 4;
void Start()
{
// 获取这些对象或变量在游戏开始时的值
rigidbody2D = GetComponent<Rigidbody2D>();
//获取起始位置
position = transform.position;
//获取起始y坐标
initY = position.y;
//设定初始移动方向
direction = 1.0f;
}
// Update is called once per frame
private void FixedUpdate()
{
//通过刚体移动的方法调用,放入 fixupdate方法中,0.02秒执行一次
MovePosition();
}
private void MovePosition()
{
if (position.y - initY < distance && direction > 0)
{
position.y += speed;
}
if (position.y - initY >= distance && direction > 0)
{
direction = -1.0f;
}
if (position.y - initY > 0 && direction < 0)
{
position.y -= speed;
}
if (position.y - initY <= 0 && direction < 0)
{
direction = 1.0f;
}
rigidbody2D.position = position;
}
}
这段代码开放了移动速度,通过判定和初始位置的距离来进行来回移动(仅仅设定了在y轴上);当然x轴上改下代码就可以
第二种移动控制(来自官网)
public class EnemyController2 : MonoBehaviour
{
public float speed;
public bool vertical;
Rigidbody2D rigidbodyroot;
//朝一个方向走的时间
public float changeTime = 3.0f;
//计时器
float timer;
//方向
int direction=1;
void Start()
{
rigidbodyroot = GetComponent<Rigidbody2D>();
timer = changeTime;
}
private void Update()
{
timer -= Time.deltaTime;
if (timer < 0)
{
direction = -direction;
timer = changeTime;
}
}
private void FixedUpdate()
{
Vector2 position = rigidbodyroot.position;
if (vertical)
{
position.y = position.y + speed * Time.deltaTime*direction;
}
else
{
position.x = position.x + speed * Time.deltaTime * direction;
}
rigidbodyroot.MovePosition(position);
}
//刚体碰撞事件
private void OnCollisionEnter2D(Collision2D other)
{
RubyController rubyController = other.gameObject.GetComponent<RubyController>();
if (rubyController != null)
{
rubyController.changehealth(-1);
}
}
}
这段代码开放了折返时间和速度以及行走方向;通过行走时间来控制行走距离;
同时加入了机器人碰到主角ruby时使主角掉血;
加入掉血区域
在掉血区域我们使用钉子作为图片素材,因为我们要实现在其中要一直收到判定,而不是只在碰到触发器时判定
所以代码中我们使用 OnTriggerStay2D 表示每一帧都会触发触发器
RubyController rubyController = collision.GetComponent<RubyController>();
if (rubyController != null)
{
rubyController.changehealth(DamageNum);
}
问题1:关于这个区域需要较大时,我们的素材会重复使用,这里我们就需要用到平铺素材
平铺素材第一件事,我们需要回到素材界面在sprite Mode下找到Mesh Type使用Full Rect
然后在在预制件中的Box Collider 2D中勾选Auto Tiling即可。
问题2:判定使用的代码
unity中自带三种判定 OnTriggerEnter2D OnTriggerStay2D OnTriggerExit2D分别表示进入时判定一次
在触发器内每帧判定一次和离开时判定一次;
这片文章所使用的素材来自unity商店Ruby’s adventure
链接unity官网