我有一些代码遵循一个很好的教程,但我不明白为什么。代码是根据它的方向从左到右翻转一个简单的2D角色。
private bool facingright;
void Start () {
//defaults that we are in fact facing right when game starts.
facingright = true;
显然,它只是说游戏开始时bool是真的。然后我们创建一个额外的方法来控制它何时为真:
private void Flip(float horizontal){
//if horizontal is greater than 0 and not facing right.
//or if horizontal is less than zero and is facing right
if (horizontal > 0 && !facingright || horizontal < 0 && facingright) {
//you are no longer facing right, but how does it go back?
facingright = !facingright;
//theScale is transforming the x axis on scale.
Vector3 theScale = transform.localScale;
//the value of the axis change is x * -1
theScale.x *= -1;
//Then change the new value to theScale?
transform.localScale = theScale;
所以,我不能为我的生活包围我为什么这个If语句有效。你可以在评论中看到我明白,如果发生这种情况或其他事情发生,它会激活。从我的理解来看,这只会使面对面直立 - 面对面 - 但它又是如何回归的!面对面=面向右边?
它是说面朝右=!面对,但如果这已经是真的,那么倒转它?
同时,缩放将x轴移动到1或-1。代码虽然只请求执行一次。它是如何还原变化的?任何理解这一点的帮助将不胜感激。我认为这是与这篇文章相关的所有代码。
答案 0 :(得分:3)
要理解代码,首先需要了解您要实现的目标。具体做法是:
horizontal
移动值为正,则角色将移动到屏幕的右侧。在这种情况下,您希望角色朝右。即您希望facingright
值为true
。相反,如果值为负,则您希望面向左侧,facingright
值为false
。horizontal
值为正,且facingright
不 true
(即false
),或horizontal
值为负数且facingright
为 true
,那么我们需要对此做些什么。否则,不是。了解&&
和||
运算符的优先顺序也很有帮助。特别是,&&
运算符的优先级高于||
。
因此,if
语句中的表达式 - horizontal > 0 && !facingright || horizontal < 0 && facingright
- 正在将上面的第二个项目符号转换为代码。你可以更正确地阅读它(horizontal > 0 && !facingright) || (horizontal < 0 && facingright)
,这是要点的本质。检查移动值是否与“正确”值相匹配,如果它们不匹配,请执行相关操作。
那么,该怎么办呢?嗯,首先要反转facingright
值。这就是facingright = !facingright;
的作用。这样可以修复标记,使其与移动方向相匹配。
接下来要做的是实际调整角色所面对的方向。在您发布的代码中,只需翻转角色的变换即可完成此操作。否定从变换中检索的缩放矢量的x
分量具有此效果。它导致角色的坐标空间相对于世界坐标空间反转,这反过来导致角色被绘制为其正常外观的一种镜像,即绕垂直轴翻转。
请注意,语句theScale.x *= -1;
等同于theScale.x = theScale.x * -1;
。因此,如果x
的值为1
,则新值为-1
,如果该值已为-1
,则会将其设置回1
。
当然,只有当facingright
值与实际移动方向不同时,所有代码才会被执行。
对于它的价值,我觉得这个代码有点脆弱。我不喜欢不依赖于需要彼此同步的状态变量。这里代码简单地注意当移动值从正值变为负值或反之亦然时,并且将变换更新为与移动方向对应的绝对正值或负值,而不是总是如此否定标志和变换比例的x
值。但这肯定是对代码的主观评估。你现在拥有的代码本身并没有什么不妥。